【问题标题】:Convert hex string to ansistring in Delphi 2010在 Delphi 2010 中将十六进制字符串转换为 ansistring
【发布时间】:2011-07-09 16:54:16
【问题描述】:

我曾经在 Delphi 6 中使用此函数将十六进制字符串转换为字符串:

const
testSign = '207F8060287F585054505357FFD55861';

function Hex2Dec(const data: string): byte;
var
  nH1, nH2: byte;
begin
  if data[1] in ['0' .. '9'] then
    nH1 := strtoint(data[1])
  else
    nH1 := 9 + ord(data[1]) - 64;
  if data[2] in ['0' .. '9'] then
    nH2 := strtoint(data[2])
  else
    nH2 := 9 + ord(data[2]) - 64;
  Result := nH1 * 16 + nH2;
end;

function HexStrToStr(const HexStr: string): string;
var
  BufStr: string;
  LenHex: Integer;
  x, y: Integer;
begin
  LenHex := Length(HexStr) div 2;
  x := 1;
  y := 0;
  while y <> LenHex do
  begin
    Inc(y);
    BufStr := BufStr + Chr(Hex2Dec(HexStr[x] + HexStr[x + 1]));
    Inc(x, 2);
  end;
  Result := BufStr;
end;

现在我想在 Delphi 2010 中使用该功能。

const
testSign: AnsiString = '207F8060287F585054505357FFD55861';

function Hex2Dec(const data: ansistring): byte;
var
  nH1, nH2: byte;
begin
  if data[1] in ['0' .. '9'] then
    nH1 := strtoint(data[1])
  else
    nH1 := 9 + ord(data[1]) - 64;
  if data[2] in ['0' .. '9'] then
    nH2 := strtoint(data[2])
  else
    nH2 := 9 + ord(data[2]) - 64;
  Result := nH1 * 16 + nH2;
end;

function HexStrToStr(const HexStr: ansistring): ansistring;
var
  BufStr: ansistring;
  LenHex: Integer;
  x, y: Integer;
begin
  LenHex := Length(HexStr) div 2;
  x := 1;
  y := 0;
  while y <> LenHex do
  begin
    Inc(y);
    BufStr := BufStr + Chr(Hex2Dec(HexStr[x] + HexStr[x + 1]));
    Inc(x, 2);
  end;
  Result := BufStr;
end;

D6 中第一个代码的输出:

' '#$7F'€`('#$7F'XPTPSWÿÕXa'

D2010 中第二个代码的输出:

' '#$7F#$0080'`('#$7F'XPTPSWÿÕXa'

如何修复 D2010 中的代码,使其产生与 D6 相同的结果?

【问题讨论】:

  • 我不参加最长答案竞赛。了解你的图书馆,使用 Classes.BinToHex()Classes.HexToBin()
  • ...正如我在下面的回答中所建议的...

标签: delphi unicode hex


【解决方案1】:

除了其他人提供的解决方案外,您还可以使用内置功能:

function HexStrToStr(const HexStr: string): string;
var
  tmp: AnsiString;
begin
  Assert(not Odd(Length(HexStr)), 'HexToStr input length must be an even number');
  SetLength(tmp, Length(HexStr) div 2);
  HexToBin(PWideChar(HexStr), @tmp[1], Length(tmp));
  result := tmp;
end;

这个实现假定十六进制编码的字符串首先是一个 Ansistring。为了灵活性,我建议改用 TBytes

【讨论】:

  • @David,因为内置不处理大写 A-F。
  • @Cosmin 然后打电话给UpperCase
  • @Cosmin,至少在 Delphi XE 中,你输入什么都没有关系。HexToBin 处理小写字母和大写字母。
  • @David,UpperCasing 字符串来调用平凡的 5 LOC 函数并不聪明:您将在此过程中制作字符串的完整副本。在我的回答中,我试图将字符串复制和重新分配保持在最低限度,因为这将是性能下降的地方。
  • @Cosmin,latest help 的读取方式相同,但您可以通过将 cmets 留在该页面的讨论选项卡上来引起 Embarcadero 的注意。
猜你喜欢
  • 2018-01-31
  • 2018-01-22
  • 1970-01-01
  • 2013-02-07
  • 2011-03-28
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
相关资源
最近更新 更多