Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   80 bit IEEE Standard 754 floating point number (https://www.delphipraxis.net/211106-80-bit-ieee-standard-754-floating-point-number.html)

calibra301 29. Jul 2022 11:24

80 bit IEEE Standard 754 floating point number
 
Hallo,

habe in einem Datenstream (*.AIFF . Ein Audiofileformat was missbraucht wurde um andere Daten zu transportieren.) eine
"80 bit IEEE Standard 754 floating point number (Standard Apple Numeric Environment [SANE] data type Extended)."

gekapselt die ich in einen Record einlesen möchte. Auch im C-Code wird ein 10 Byte langer Array of Char eingelesen und dann gewandelt.

Lt. Delphi Doku wäre Extended der richtige Datentyp (10 Byte). Zumindestens auf 32 Bit Systemen.
Lese ich die Daten in eine Variable vom Typ Extendet steht da leider aber auch nicht das erwartete Ergebnis drin.

Im C-Beispiel ist das ganze etwas aufwendiger.
Siehe da: https://github.com/mpruett/audiofile...ile/extended.c

Im Wert steht die Samplingrate des Files. Ein anderes Programm sagt es wären 48KHz ($BB80 ) .
Im Char-Array stehen $40, $0E, $BB, $80, $00, $00, $00, $00, $00, $00.
Bei den Werten ist der Windows Calculator auch am Ende... :-(

Kann mir jemand mit der Delphi-Übersetzung helfen ?

Uwe Raabe 29. Jul 2022 12:31

AW: 80 bit IEEE Standard 754 floating point number
 
Delphi-Quellcode:
function Convert(Bytes: TBytes): Extended;
var
  exponent: Word;
  mantissa: UInt64;
  signBit: Boolean;
begin
  signBit := (bytes[0] and $80) <> 0;
  WordRec(exponent).Hi := Bytes[0] and $7F;
  WordRec(exponent).Lo := Bytes[1];
  for var I := 0 to 7 do
    Int64Rec(mantissa).Bytes[I] := Bytes[9 - I];
  Result.BuildUp(signbit, mantissa, Integer(exponent) - 16383);
end;

dummzeuch 29. Jul 2022 12:59

AW: 80 bit IEEE Standard 754 floating point number
 
Schonmal versucht, die Bytes vor der Zuweisung umzudrehen?

Edit: Uwe war mal wieder schneller.

himitsu 29. Jul 2022 13:29

AW: 80 bit IEEE Standard 754 floating point number
 
Wirklich "Char-Array" ?
AnsiChar oder besser Byte.

Und dann, wie Thomas auch sagen wollte ... Big-Endian oder Little-Endian, wo man manchmal aufpassen muß, also in welcher Reihenfolge die Bytes im Speicher liegen, bzw. wie rum der Typ liegt.

Ansonsten kann man natürlich ein Array of Byte (oder AnsiChar) direkt in einen Extended casten, wenn die Reihenfolge der Bytes stimmt und es wirklich dem "80 bit IEEE Standard 754" entspricht.


Der Vorteil von Uwes Lösung (ebenso, wie im C++) ist natürlich, dass man diese Bytes auch in einen anderen Typen überführen kann, wie z.B. Single oder Double. (oder Extended, was außerhalb Win32 intern auch gern mal ein Double ist)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz