There is no version of Classes.BinToHex()
, in either Delphi or FreePascal, that takes 2 parameters, or has a return value. Not only that, but the buffer size passed in is the binary bye count, not the hex character count, so it makes no sense to pass in 2
when hex-encoding a single AnsiChar
. So, the FreePascal code you have shown must be using a custom overload of BinToHex()
.
In any case, any of the following overloads of Classes.BinToHex()
can be used to hex-encode an AnsiString
in Delphi:
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;
For example:
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;
Or, if you change the Result
to (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;