Delphi,BinToHex怎么用?

In Delphi, how do you use BinToHex?

来自 LCL 和 Lazarus Pascal,我正在尝试将我的所有代码转换为 Delphi Pascal。

一条行不通涉及 BinToHex:

function BinStr2Hex(S: AnsiString): AnsiString;
var
  i: integer;
begin
  Result := '';
  for i := 1 to Length(S)
    do Result := Result + AnsiLowerCase(BinToHex(Bytes(S[i]), 2));
end;

这会引发未声明的标识符字节错误(不确定如何将其写为声明?)还是我必须改用 TBytes?

如果我将其更改为 TBytes,则会出现不同的错误 - 没有可以使用这些参数调用的 'BixToHex' 的重载版本。

我如何在 Delphi 10.4 中正确地写这个?

谢谢。

Classes.BinToHex()Delphi or FreePascal 中没有接受 2 个参数或具有 return 值的版本。不仅如此,传入的缓冲区大小是binary bye count,而不是hex character count,所以传入没有意义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;