我正在使用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
我对这个主题有点天真,如果您能将此十六进制字符串转换回原始输入,我将不胜感激。
答案 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;