AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein 80 bit IEEE Standard 754 floating point number
Thema durchsuchen
Ansicht
Themen-Optionen

80 bit IEEE Standard 754 floating point number

Ein Thema von calibra301 · begonnen am 29. Jul 2022 · letzter Beitrag vom 29. Jul 2022
Antwort Antwort
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#1

80 bit IEEE Standard 754 floating point number

  Alt 29. Jul 2022, 12:24
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: 80 bit IEEE Standard 754 floating point number

  Alt 29. Jul 2022, 13:31
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch
Online

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: 80 bit IEEE Standard 754 floating point number

  Alt 29. Jul 2022, 13:59
Schonmal versucht, die Bytes vor der Zuweisung umzudrehen?

Edit: Uwe war mal wieder schneller.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: 80 bit IEEE Standard 754 floating point number

  Alt 29. Jul 2022, 14:29
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jul 2022 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz