开发者

Convert hex string to ansistring in Delphi 2010

开发者 https://www.devze.com 2023-02-15 06:00 出处:网络
I used to use this function to convert hex string to string in Delphi 6 : const testSign = \'207F8060287F585054505357FFD55861\';

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(d开发者_运维知识库ata[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?


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消