Einzelnen Beitrag anzeigen

gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#7

AW: HexString to IEEE574 64 Bit

  Alt 14. Mai 2018, 15:02
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

Geändert von gammatester (14. Mai 2018 um 15:06 Uhr)
  Mit Zitat antworten Zitat