Delphi Tokyo - 功能:字符串为十六进制,十六进制为字符串

问题描述 投票:1回答:1

下面的函数非常适合将字符串转换为十六进制:

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”但没有任何反应。

有人能帮助我吗?

string function delphi hex
1个回答
7
投票

您的代码存在一些问题:

  1. 您正在将输入AnsiString错误地输入到PWideChar,因此您调用HexToBin()的错误重载。 PWideChar应该是PAnsiChar而不是。
  2. BufSizeHexToBin()参数指定输出缓冲区期望接收的字节数,但您将传递十六进制字符串中的字符数。

此外,由于String2Hex()采取AnsiString并返回UnicodeStringHex2String()应采取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;
© www.soinside.com 2019 - 2024. All rights reserved.