![]() |
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: ![]() 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 ? |
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; |
AW: 80 bit IEEE Standard 754 floating point number
Schonmal versucht, die Bytes vor der Zuweisung umzudrehen?
Edit: Uwe war mal wieder schneller. |
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