Delphi Tokyo - 功能:字符串到十六进制和十六进制到字符串

时间:2017-12-22 21:54:02

标签: string function delphi hex

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

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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:7)

您的代码存在一些问题:

  1. 您正在将输入AnsiString错误地输入到PWideChar,因此您调用HexToBin()的错误重载。 PWideChar应该是PAnsiChar

  2. BufSize HexToBin()参数指定输出缓冲区期望接收的字节数,但您将传递十六进制字符串中的字符数。

  3. 此外,由于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;
    
相关问题