Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Byte-Array to Double convertieren (https://www.delphipraxis.net/24730-byte-array-double-convertieren.html)

HPW 25. Jun 2004 08:47


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?

shmia 25. Jun 2004 09:29

Re: Byte-Array to Double convertieren
 
Zitat:

Zitat von HPW
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;

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);

maximov 25. Jun 2004 09:50

Re: Byte-Array to Double convertieren
 
Delphi-Quellcode:
arFactor := PDouble(@Aspect_Ratio[0])^;
Versteh den sinn zwar nicht, müsste ja aber gehen.

alcaeus 25. Jun 2004 09:56

Re: Byte-Array to Double convertieren
 
Delphi-Quellcode:
arFactor := 0;
for i := 0 to Length(Aspect_Ratio)-1 do
  arFactor := arFactor + Aspect_Ratio[i]+Power(10, Length(Aspect_Ratio)-1-i);
Ich hoffe du verstest den Source

Greetz
alcaeus

HPW 25. Jun 2004 18:21

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

OregonGhost 25. Jun 2004 18:35

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.

Chewie 25. Jun 2004 18:37

Re: Byte-Array to Double convertieren
 
Zitat:

Zitat von OregonGhost
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.

Ui, das sollte schief gehen. Die Rundungsfehler dabei dürften die Zahl massiv verfälschen. Besser wäre es, einfach die Bytes per MemCopy umzukopieren.

HPW 25. Jun 2004 20:18

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:
 arfactorInt : Integer;

 arFactorInt := PInteger(@Header.Aspect_Ratio[0])^;
Dann noch umkonvertiert und geteilt wie vorgeschlagen.

OregonGhost 26. Jun 2004 13:17

Re: Byte-Array to Double convertieren
 
Zitat:

Zitat von Chewie
Zitat:

Zitat von OregonGhost
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.

Ui, das sollte schief gehen. Die Rundungsfehler dabei dürften die Zahl massiv verfälschen. Besser wäre es, einfach die Bytes per MemCopy umzukopieren.

Seit wann wird bei Integer-Operationen gerundet, solange die Zahlen im Bereich bleiben?
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)

Chewie 26. Jun 2004 13:53

Re: Byte-Array to Double convertieren
 
Zitat:

Zitat von OregonGhost
Seit wann wird bei Integer-Operationen gerundet, solange die Zahlen im Bereich bleiben?

Stimmt, sind ja nur Integer-Operationen. Überlaufe sind bei den Zahlen auch nicht zu erwarten, aber dennoch ist es performance-technischer Overkill. Wenn du von Hannover nach Hamburg willst, kannst du auch zuerst mit dem Zug nach Frankfurt wahren und von dort nach Hamburg fliegen. Du könntest aber auch direkt fahren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 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