преобразования произвольного буфера длины в шестнадцатеричном:
function HexDump(const _Buffer; _Len: integer): string;
type
PByte = ^Byte;
var
i: integer;
p: PByte;
begin
p := @_Buffer;
Result := '';
for i := 0 to _Len - 1 do begin
Result := Result + Long2Hex2(p^);
Inc(p);
end;
end;
а также вспомогательные функции, используемые в этом:
const
/// <summary>
/// String containing all characters that can be used as digits
/// </summary>
DIGIT_CHARS: string = 'ABCDEFGHIJKlMNOPQRSTUVWXYZ';
function Long2Num(_l: ULong; _Base: Byte; _MinWidth: Integer = 1): string;
var
m: Byte;
begin
Result := '';
while _l > 0 do begin
m := _l mod _Base;
_l := _l div _Base;
Result := DIGIT_CHARS[m + 1] + Result;
end;
while Length(Result) < _MinWidth do
Result := '0' + Result;
end;
function Long2Hex(_l: ULong): string;
begin
Result := Long2Num(_l, 16);
end;
function Long2Hex2(_l: ULong): string;
begin
Result := Long2Hex(_l);
if Length(Result) < 2 then
Result := '0' + Result;
end;
Эти функции являются частью моей dzlib.
Примечание: Это не генерирует шестнадцатеричные числа, как вы могли бы ожидать, например. если вы передаете целое к функции, как это:
var
IntValue: integer;
begin
IntValue := $12345678;
s := HexDump(IntValue, SizeOf(IntValue));
end;
Вы в конечном итоге с S = «78563412», потому что процессоры Intel хранить целые числа в маленьком формате с обратным порядком байтов.
К сожалению, наоборот, сложнее, поскольку в Delphi нет стандартного произвольного целочисленного типа длины. Однако есть некоторые реализации такого типа.
Не могли бы вы немного рассказать о диапазоне, который вам нужен для поддержки? Int64 может конвертировать 16 шестнадцатеричных цифр или около 19 или 20 десятичных цифр. Если вам нужно выйти за рамки этого, вам нужно будет сделать свое собственное преобразование, которое использует значение с плавающей запятой для хранения десятичной части. – HeartWare
Чтобы дать конкретный совет, нам нужно знать, какой тип данных вы используете. –