![]() |
Byte-Array to Double convertieren
Ich lese aus einer Datei dies ein:
Aspect_Ratio : array[0..3] of byte; und möchte die 4 Byte in diese Variable zuweisen: arfactor : Double; Tips dazu? |
Re: Byte-Array to Double convertieren
Zitat:
Delphi-Quellcode:
var
tmpstr: string; begin // angenommen Aspect_Ratio enthält einen String (z.B. '2.50') SetString(tmpstr, PChar(Aspect_Ratio), sizeof(Aspect_Ratio)); tmpstr := StringReplace(tmpstr, '.', Decimalseparator, []); arfactor := StrToFloat(tmpstr); |
Re: Byte-Array to Double convertieren
Delphi-Quellcode:
Versteh den sinn zwar nicht, müsste ja aber gehen.
arFactor := PDouble(@Aspect_Ratio[0])^;
|
Re: Byte-Array to Double convertieren
Delphi-Quellcode:
Ich hoffe du verstest den Source
arFactor := 0;
for i := 0 to Length(Aspect_Ratio)-1 do arFactor := arFactor + Aspect_Ratio[i]+Power(10, Length(Aspect_Ratio)-1-i); Greetz alcaeus |
Re: Byte-Array to Double convertieren
Danke für die Tips.
So ganz richtig bin ich damit noch nicht weiter gekommen. Also ich möchte ein binäres Dateiformat lesen. Aus der Spezifikation des Headers:
Code:
Aspect ratio 4 Bytes Aspect ratio (horizontal size / vertical size in
inches) of the graphics area, scaled by 10,000,000. This value is always written with the least significant byte first. Header : packed record .... .... Width, Height : Word; Aspect_Ratio : array[0..3] of byte; Die Werte zu Integern konvertiert: Width = 970 Height = 514 Byte 0 1 2 3 Aspect_Ratio: 184 56 32 1 |
Re: Byte-Array to Double convertieren
Double hat meines Wissens 8 Byte, was du brauchst ist ein float (in Delphi nennt man den Single, nicht wahr?), der ist 4 Byte lang.
Abgesehen davon interpretiere ich die Herstellerangabe so, dass es sich dabei um einen Integer-Wert handelt. Ich bekomme gemäß der Anleitung den Wert 18.888.888 raus, und da das laut Hersteller mit 10.000.000 skaliert ist, lautet der Wert also 1,8888888. Werden auf Intel-Maschinen Integer nicht sowieso "falsch 'rum" gespeichert? Wenn ja, kannst du einfach den Wert als DWORD oder UInt32 (also vorzeichenloser 32 Bit Integer) auslesen. Wenn nein, liest du die Bytes einzeln aus, multipliziert das erste mit 1, das zweite mit 256, das dritte mit 65536 und das vierte mit 16777216. Ach so, und wenn du dann den UInt hast, einfach in Single oder Real oder so konvertieren und durch 10.000.000 teilen. |
Re: Byte-Array to Double convertieren
Zitat:
|
Re: Byte-Array to Double convertieren
Nochmal Danke an Alle.
Das mit dem Double war natürlich ein grosser Irrtum meinerseits. Dies hat nun funktioniert!
Code:
Dann noch umkonvertiert und geteilt wie vorgeschlagen.
arfactorInt : Integer;
arFactorInt := PInteger(@Header.Aspect_Ratio[0])^; |
Re: Byte-Array to Double convertieren
Zitat:
Wenn ich das so in Delphi schreibe, dann kommt bei mir das exakte Ergebnis heraus, wie zu erwarten. Ist 'ne andere Sache, dass es andere (bessere) Wege gibt, aber so geht es auch ;c) |
Re: Byte-Array to Double convertieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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