在 Delphi 2010 中将十六进制字符串转换为 ansisstring

发布于 2024-10-20 09:37:54 字数 1757 浏览 2 评论 0原文

我曾经在 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 相同的结果吗?

I used to use this function to convert hex string to string in 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;

Now I want to use the function with 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;

Output from first code in D6 :

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

Output from second code in D2010 :

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

How do I fix the code in D2010 so it can produces same result like D6?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情痴 2024-10-27 09:37:54

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

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 代替。

Besides the solutions others provided, you can also make use of the built-in function:

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;

This implementation assumes that the hex-encoded string has been an Ansistring in the first place. For flexibility I suggest to use TBytes instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文