在Delphi 或FreePascal 中,没有任何版本的Classes.BinToHex() 接受2 个参数或有返回值。不仅如此,传入的缓冲区大小是 binary bye 计数,而不是 hex 字符计数,因此在使用 hex- 时传入 2 是没有意义的编码单个AnsiChar。因此,您显示的 FreePascal 代码必须使用 BinToHex() 的自定义重载。
在任何情况下,Classes.BinToHex() 的以下任何重载都可用于在 Delphi 中对 AnsiString 进行十六进制编码:
procedure BinToHex(Buffer: PAnsiChar; Text: PWideChar; BufSize: Integer); overload;
procedure BinToHex(Buffer: PAnsiChar; Text: PAnsiChar; BufSize: Integer); overload;
procedure BinToHex(var Buffer; Text: PWideChar; BufSize: Integer); overload; inline;
procedure BinToHex(var Buffer; Text: PAnsiChar; BufSize: Integer); overload; inline;
procedure BinToHex(Buffer: Pointer; Text: PWideChar; BufSize: Integer); overload; inline;
procedure BinToHex(Buffer: Pointer; Text: PAnsiChar; BufSize: Integer); overload; inline;
例如:
uses
System.Classes, System.AnsiStrings;
// Note: I would suggest using RawByeString instead for the input...
function BinStr2Hex(S: AnsiString{RawByteString}): AnsiString;
begin
SetLength(Result, Length(S)*2);
BinToHex(PAnsiChar(S), PAnsiChar(Result), Length(S));
// or: BinToHex(S[1], PAnsiChar(Result), Length(S));
// or: BinToHex(Pointer(S), PAnsiChar(Result), Length(S));
Result := AnsiStrings.AnsiLowerCase(Result);
end;
或者,如果您将Result 更改为(Unicode)String:
uses
System.Classes, System.SysUtils;
// Note: I would suggest using RawByeString instead for the input...
function BinStr2Hex(S: AnsiString{RawByteString}): String;
begin
SetLength(Result, Length(S)*2);
BinToHex(PAnsiChar(S), PChar(Result), Length(S));
// or: BinToHex(S[1], PChar(Result), Length(S));
// or: BinToHex(Pointer(S), PChar(Result), Length(S));
Result := SysUtils.AnsiLowerCase(Result);
end;