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;
来自 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;