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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi Tokyo - 功能:字符串为十六进制,十六进制为字符串相关的知识,希望对你有一定的参考价值。

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

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. 您正在将输入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;

以上是关于Delphi Tokyo - 功能:字符串为十六进制,十六进制为字符串的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 如何将十六进制的UTF-8编码转换为汉字

Delphi十进制和十六进制互转

在 Delphi 中将宽字符代码点的十六进制字符串表示形式转换为宽字符

delphi 十六进制高低位拆分,请高手指点!

Delphi 十六进制 数据类型问题

怎么把一个整数转化为3个十六进制字节 delphi