【问题标题】:Delphi Tokyo - Function: String to Hex and Hex to StringDelphi Tokyo - 函数:字符串到十六进制和十六进制到字符串
【发布时间】:2017-12-22 21:54:02
【问题描述】:

下面的函数可以完美地将字符串转换为十六进制:

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

有人可以帮我吗?

【问题讨论】:

  • @RemyLebeau:docs 还是说十六进制数必须使用小写字符; HexToBin 不识别大写字符。例如:“ACDC66”是一个无效字符串,您必须改用“acdc66”。请参阅文本参数部分,第一个项目符号。我从您下面的评论中看到您已将其报告为文档错误。感谢您在这里指出。在您有机会看到此回复后,我会在几分钟内删除我的 cmets。

标签: string function delphi hex


【解决方案1】:

您的代码有几个问题:

  1. 您将输入 AnsiString 错误地类型转换为 PWideChar,因此您调用了错误的 HexToBin() 重载。 PWideChar 应改为 PAnsiChar

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

此外,由于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;

【讨论】:

  • Point '3' 是文档中的错误。 HexToBin 至少从 D7 开始占大写字母(我可以检查的旧版本是 D3,它根本没有这个功能)。
  • @SertacAkyuz:你是对的,我在发布前检查代码时误读了代码。仅供参考,对大写的支持至少可以追溯到 Delphi 5,如果不是 4 的话(但它直到 Delphi 2009 才忽略非十六进制字符 #58..#64,#91..#96)。
  • @SertacAkyuz:我报告了文档错误:RSP-19625
  • android 中的firemonkey 没有PAnsiCharAnsiString
  • @peimanF。所以只需使用StringPChar 代替。你不需要AnsiString 支持来使用十六进制字符串。 Bin2Hex()Hex2Bin() 针对 Unicode 字符串进行了重载。否则,安装 Andreas Hausladen 的 ByteStrings patch
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2020-11-07
  • 2016-02-26
  • 2019-07-27
  • 1970-01-01
相关资源
最近更新 更多