【问题标题】:In Delphi, how do you use BinToHex?在 Delphi 中,如何使用 BinToHex?
【发布时间】:2021-10-25 23:45:36
【问题描述】:

来自 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 中正确编写此代码?

谢谢。

【问题讨论】:

标签: delphi delphi-10.4-sydney


【解决方案1】:

DelphiFreePascal 中,没有任何版本的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;

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多