function a1(Str: String): String; var i: integer; begin result := ''; for i := 1 to Length(Str) do result := result + IntToHex( Ord( Str[i] ), 2 ); end;
function a2(Str: String): String; var i: integer; begin result := ''; for i := 1 to Length(Str) do begin if ((i mod 2) = 1) then result := result + chr( StrToInt( '0x' + Copy( Str, i, 2 ))); end; end;
----------------------------------------------
-
出现问题的原因是XE10的string与D7的string完全不同的内部格式。d7的string是AnsiString,用2个字节存汉字,一个字节存英文,XE10的string是UnicodeString,英文与中文都用2个字节来保存一个字符,按下面改一下就能够同时在d7与xe10下运行了,需要注意的是转换后的Hex是不同的。 function a1(Str: String): String; var i: integer; begin result := ''; for i := 1 to Length(Str) do result := result + IntToHex( Ord( Str[i] ), 4 ); end;
function a2(Str: String): String; var i: integer; begin result := ''; for i := 1 to Length(Str) do begin if ((i mod 4) = 1) then result := result + chr( StrToInt( '0x' + Copy( Str, i, 4 ))); end; end;
搞定了: function WStr2Hex(const AStr: WideString): AnsiString; var i: integer; p:PAnsiChar; begin Result:=''; p:=PAnsiChar(Integer(AStr)-1); for i := 1 to Length(AStr)*2 do Result := Result + IntToHex( Byte(p[i]), 2 ); end;
function Hex2WStr(const AHex: AnsiString): WideString; var i: integer; p:PByte; begin SetLength(Result,Length(AHex) div 4); p:=PByte(Integer(Result)); for i := 1 to Length(AHex) div 2 do begin p^:= (StrToInt('0x'+Copy(AHex,(i-1)*2+1,2))); Inc(p); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin edit1.Text:=WStr2Hex(edit0.text); edit2.Text:=Hex2WStr(edit1.Text); end;
ansistring到string的隐式转换时安全的,可以忽略。要是有强迫症,给你一个没有任何warning的版本,这次将Hex2WStr/WStr2Hex独立出来单独放在一个文件中。 { WideString to UTF16-LE Byte Encoding HEX Converting Support Delphi7 to Delphi 10.1 Berling by c5soft@189.cn, Version 1.0.0.0, 2016-12-17 } unit uWStr2Hex;
interface
function WStr2Hex(const AStr: WideString): string; function Hex2WStr(const AHex: string): WideString;
implementation
uses sysUtils;
function WStr2Hex(const AStr: WideString): string; var i: integer; p:PAnsiChar; begin Result:=''; p:=PAnsiChar(Integer(AStr)-1); for i := 1 to Length(AStr)*2 do Result := Result + IntToHex( Byte(p[i]), 2 ); end;
function Hex2WStr(const AHex: string): WideString; var i: integer; p:PByte; begin SetLength(Result,Length(AHex) div 4); p:=PByte(Integer(Result)); for i := 1 to Length(AHex) div 2 do begin p^:= StrToInt('0x'+Copy(AHex,(i-1)*2+1,2)); Inc(p); end; end;
{********** WideString to UTF16-LE Byte Encoding HEX Converting Support Delphi7 to Delphi 10.1 Berling by c5soft@189.cn, Version 1.0.0.1, 2016-12-17 **********} unit uWStr2Hex;
interface
function WStr2Hex(const AStr: WideString): string; function Hex2WStr(const AHex: string): WideString;
implementation
uses sysUtils;
function WStr2Hex(const AStr: WideString): string; var i: integer; p: PByte; begin Result := ''; p := PByte(AStr); for i := 1 to Length(AStr) * 2 do begin Result := Result + IntToHex(p^, 2); Inc(p); end end;
function Hex2WStr(const AHex: string): WideString; var i: integer; p: PByte; begin SetLength(Result, Length(AHex) div 4); p := PByte(Result); for i := 1 to Length(AHex) div 2 do begin p^ := StrToInt('0x' + Copy(AHex, (i - 1) * 2 + 1, 2)); Inc(p); end; end;
这是1.0.0.2版本,这次内部用PWord,一次处理两个字节,速度更快。输出的十六进制串位置有所不同,是UTF16-BE编码,1.0.0.1是UTF16-LE编码。 字符串: ab1 UTF16-LE: 610062003100 UTF16-BE: 006100620031 下面是源代码: {********** WideString to UTF16-BE Byte Encoding HEX Converting Support Delphi7 to Delphi 10.1 Berling by c5soft@189.cn, Version 1.0.0.2, 2016-12-17 **********} unit uWStr2Hex;
interface
function WStr2Hex(const AStr: WideString): string; function Hex2WStr(const AHex: string): WideString;
implementation
uses sysUtils;
function WStr2Hex(const AStr: WideString): string; var i: integer; p: PWord; begin Result := ''; p := PWord(AStr); for i := 1 to Length(AStr) do begin Result := Result + IntToHex(p^, 4); Inc(p); end end;
function Hex2WStr(const AHex: string): WideString; var i,nLen: integer; p: PWord; begin nLen:=Length(AHex) div 4; SetLength(Result, nLen); p := PWord(Result); for i := 1 to nLen do begin p^ := Word(StrToInt('0x' + Copy(AHex, (i - 1) * 4 + 1, 4))); Inc(p); end; end;