Ich nehme an, mit IEEE574 64 Bit meinst Du binary64 also double? Die eigeneliche Frage ist, was Dein Hex-String bedeuten soll. Ist das 'Big-Endian' oder 'Little-Endian'?. Als Beispiel für dezimal:
Gilt '123' -> 123 oder '123' -> 321 ?
IMO ist hier die Big-Endian-Interpretation die natürliche, hier der entsprechende Code aus meiner
DAMath-Unit
Delphi-Quellcode:
type
THexDblA =
packed array[0..7]
of byte;
{Double as array of bytes}
{---------------------------------------------------------------------------}
procedure Hex2Float(
const hex:
string; n: integer;
var a: THexDblA;
var code: integer);
{-Common code for hex to float conversion, internal use only}
var
i,j,m: integer;
b: byte;
c: char;
const
c0 = ord('
0');
cal = ord('
a') - 10;
cau = ord('
A') - 10;
begin
if hex='
'
then code := -1
else if (n=7)
or (n=3)
then begin
if hex[1]='
$'
then m := 1
else m := 0;
if length(hex)<>2*n+2+m
then code := -2
else begin
b := 0;
j := n;
// LE: j=0, BE: j=n
for i:=0
to 2*n+1
do begin
inc(m);
c := hex[m];
if (c>='
0')
and (c<='
9')
then b := (b
shl 4)
or ((ord(c)-c0 )
and $0F)
else if (c>='
A')
and (c<='
F')
then b := (b
shl 4)
or ((ord(c)-cau)
and $0F)
else if (c>='
a')
and (c<='
f')
then b := (b
shl 4)
or ((ord(c)-cal)
and $0F)
else begin
code := -4;
exit;
end;
if odd(i)
then begin
a[j] := b;
b := 0;
dec(j);
// LE: inc(j), BE: dec(j)
end;
end;
code := 0;
end;
end
else code := -3;
end;
{---------------------------------------------------------------------------}
procedure Hex2Dbl(
const hex:
string;
var d: double;
var code: integer);
{-Convert big-endian hex string to double, leading $ is skipped, OK if code=0;}
{ hex must have 16 hex characters (17 if leading $), inverse of Dbl2Hex.}
var
a: THexDblA;
t: double
absolute a;
begin
Hex2Float(hex, 7, a, code);
if code=0
then d := t;
end;
Aus Deinem Beispiel entnehme ich allerdings, dass Du wohl Little-Endian haben willst (in diesem Fall ändere die zwei markierten Stellen im Code). Das Testprogramm
Delphi-Quellcode:
program th2d;
{$Apptype console}
{Funktionen von oben, überschreibt Big-Endian}
var
x: double;
e: integer;
begin
Hex2Dbl('E17A14AE47613740',x,e);
writeln(x);
end.
gibt dann folgendes aus
Code:
D:\Work\DAMath>th2d.exe
2.33800000000000E+0001