Вы можете "преобразовать" из шестнадцатеричного числа в число с плавающей точкой, используя целое число, достаточно большое, чтобы охватить используемое значение с плавающей точкой, а затем использовать ключевое слово ABSOLUTE
. Все, что на самом деле делает, это кодирует память значения как целое число. Будьте очень осторожны, чтобы использовать типы одинакового размера (вы можете использовать SIZEOF
, чтобы найти объем памяти значения). Если вам нужен нечетный размер, то абсолютный по отношению к массиву байтов и циклический и преобразовать в / из каждого байта (который будет шестнадцатеричный двух символов).
Ключевое слово ABSOLUTE
заставляет две переменные запускаться по одному и тому же адресу памяти, любое значение, записанное из одной, сразу же доступно в другой.
var
fDecimal : Double; // size = 8 bytes
fInteger : Int64 absolute fDecimal; // size = 8 bytes
begin
fDecimal := 3.14;
ShowMessage(format('%x=%f',[fInteger,fDecimal]));
fInteger := StrToInt64('$1234123412341234');
ShowMessage(FloatToStr(fDecimal)+'='+Format('%x',[fInteger]));
end;
вот процедура для поплавков с нечетными размерами:
var
fDecimal : extended;
fInteger : array[1..10] of byte absolute fDecimal;
sHex : string;
iX : integer;
begin
ShowMessage(IntToStr(SizeOf(fDecimal))+':'+IntToStr(SizeOf(fInteger)));
fDecimal := 3.14;
sHex := '';
for iX := 1 to 10 do
sHex := sHex + IntToHex(fInteger[iX],2);
ShowMessage(sHex);
// clear the value
fDecimal := 0.0;
// Reload the value
for iX := 1 to (Length(sHex) DIV 2) do
fInteger[iX] := StrToInt('$'+Copy(sHex,(Ix*2)-1,2));
ShowMessage(FloatToStr(fDecimal));
end;