Delphi 2010里,如何将十六进制字符串转换成ansistring,有更长的词法技巧吗?

2026-04-10 02:241阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计439个文字,预计阅读时间需要2分钟。

Delphi 2010里,如何将十六进制字符串转换成ansistring,有更长的词法技巧吗?

我曾使用过这个函数,将十六进制字符串转换成Delphi 6中的字符串:pascalconst testSign='207F8060287F585054505357FFD55861';function Hex2Dec(const data: string): byte;var nH1, nH2: byte;begin if data[1] in ['0'..'9'] then nH1 :=...end;

Delphi 2010里,如何将十六进制字符串转换成ansistring,有更长的词法技巧吗?

我曾经使用这个函数将十六进制字符串转换为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相同的结果?

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

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.

本文共计439个文字,预计阅读时间需要2分钟。

Delphi 2010里,如何将十六进制字符串转换成ansistring,有更长的词法技巧吗?

我曾使用过这个函数,将十六进制字符串转换成Delphi 6中的字符串:pascalconst testSign='207F8060287F585054505357FFD55861';function Hex2Dec(const data: string): byte;var nH1, nH2: byte;begin if data[1] in ['0'..'9'] then nH1 :=...end;

Delphi 2010里,如何将十六进制字符串转换成ansistring,有更长的词法技巧吗?

我曾经使用这个函数将十六进制字符串转换为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相同的结果?

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

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.