下面的函数非常适合将字符串转换为十六进制:
function String2Hex(const Buffer: AnsiString): string;
begin
SetLength(Result, Length(Buffer) * 2);
BinToHex(@Buffer[1], PWideChar(@Result[1]), Length(Buffer));
end;
ShowMessage(String2Hex('stackoverflow'));
结果:“737461636B6F766572666C6F77”
问题在于将十六进制转换为字符串的功能:
function Hex2String(const Buffer: AnsiString): string;
begin
SetLength(Result, Length(Buffer) div 2);
HexToBin(PWideChar(@Buffer[1]), @Result[1], Length(Buffer));
end;
ShowMessage(Hex2String('737461636B6F766572666C6F77'));
结果应该是“stackoverflow”但没有任何反应。
有人能帮助我吗?
您的代码存在一些问题:
AnsiString
错误地输入到PWideChar
,因此您调用HexToBin()
的错误重载。 PWideChar
应该是PAnsiChar
而不是。BufSize
的HexToBin()
参数指定输出缓冲区期望接收的字节数,但您将传递十六进制字符串中的字符数。此外,由于String2Hex()
采取AnsiString
并返回UnicodeString
,Hex2String()
应采取UnicodeString
并返回AnsiString
匹配。
试试这个:
function String2Hex(const Buffer: AnsiString): string;
begin
SetLength(Result, Length(Buffer) * 2);
BinToHex(PAnsiChar(Buffer), PChar(Result), Length(Buffer));
end;
function Hex2String(const Buffer: string): AnsiString;
begin
SetLength(Result, Length(Buffer) div 2);
HexToBin(PChar(Buffer), PAnsiChar(Result), Length(Result));
end;
var
hex: string;
str: AnsiString;
begin
hex := String2Hex('stackoverflow');
ShowMessage(hex); // shows '737461636B6F766572666C6F77'
str := Hex2String(hex);
ShowMessage(str); // shows 'stackoverflow'
end;