使用Delphi 2010,如何将Unicode字符串转换为十六进制字符串,然后返回?

时间:2011-11-22 20:14:03

标签: delphi unicode

我正在使用Delphi 2010,我需要能够将字符串转换为十六进制字符串,然后才能将该十六进制字符串转换回原始的unicode字符串。

例如,我的字符串是:МихаилВасильевичЛомоносов

我能够使用Warren P's StringToHex16 snippet here(我粘贴下面的Warren的片段)将字符串转换为十六进制字符串,但我不知道如何将该十六进制字符串转换回原始的unicode字符串。< / p>

function StringToHex16(str: string): string;
var
   i:integer;
   s:string;
begin
       s:='';

       for i:=1 to length(str) do begin
           s:=s+inttohex(Integer(str[i]),4);
       end;
       result:=s;

end;

使用链接的StringToHex16给出了这个十六进制字符串:

041C04380445043004380301043B002004120430044104380301043B044C04350432043804470020041B043E043C043E043D043E03010441043E0432

我对这个主题有点天真,如果您能将此十六进制字符串转换回原始输入,我将不胜感激。

2 个答案:

答案 0 :(得分:7)

链接函数为输入字符串中的每个字符生成四个十六进制数字,因此反函数需要使用四个字符的块并将它们转换为一个。该函数使用IntToHex将输入字符串的数字字符代码转换为输出字符,IntToHex的反函数为StrToInt,带有十六进制前缀,所以让我们使用它。

function HexToString16(const str: string): string;
var
  i: Integer;
  code: string;
begin
  Result := '';
  i := 1;
  while i < Length(str) do begin
    code := Copy(str, i, 4);
    Result := Result + Chr(StrToInt('$' + code));
    Inc(i, 4);
  end;
end;

此函数假定输入是由StringToHex16或等效的东西生成的。如果它不包含四个十六进制数字的倍数,则行为未定义。

答案 1 :(得分:0)

如果你愿意,我有这个工作功能。它不支持Unicode。它可以很容易地修改为返回一个块

Function HexStringToBytes(Const Value: String): TBytes;
Var
  i, v: Integer;
  dg0, dg1: Byte;
  HexStr: String;
Begin
  HexStr := '';
  For i:= 1 To Length(Value) Do If Value[i] <> #32 Then HexStr := HexStr + Value[i];
  SetLength( Result, Length(HexStr) Div 2 );
  For i:= 1 To Length(HexStr) Div 2 Do
    Begin
      dg0 := 0;
      dg1 := 1;
      If TryStrToInt( '$' + HexStr[i*2 -1], v ) Then dg0 := Byte(v) Shl 4;
      If TryStrToInt( '$' + HexStr[i*2], v )    Then dg1 := Byte(v);
      Result[i-1] := dg0 + dg1;
    End;
End;