AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Byte-Array to Double convertieren

Ein Thema von HPW · begonnen am 25. Jun 2004 · letzter Beitrag vom 26. Jun 2004
Antwort Antwort
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#1

Byte-Array to Double convertieren

  Alt 25. Jun 2004, 08:47
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?
Hans-Peter
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Byte-Array to Double convertieren

  Alt 25. Jun 2004, 09:29
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);
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Byte-Array to Double convertieren

  Alt 25. Jun 2004, 09:50
arFactor := PDouble(@Aspect_Ratio[0])^; Versteh den sinn zwar nicht, müsste ja aber gehen.
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#4

Re: Byte-Array to Double convertieren

  Alt 25. Jun 2004, 09:56
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#5

Re: Byte-Array to Double convertieren

  Alt 25. Jun 2004, 18:21
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
Hans-Peter
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#6

Re: Byte-Array to Double convertieren

  Alt 25. Jun 2004, 18:35
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Byte-Array to Double convertieren

  Alt 25. Jun 2004, 18:37
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#8

Re: Byte-Array to Double convertieren

  Alt 25. Jun 2004, 20:18
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.
Hans-Peter
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#9

Re: Byte-Array to Double convertieren

  Alt 26. Jun 2004, 13:17
Zitat von Chewie:
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)
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Byte-Array to Double convertieren

  Alt 26. Jun 2004, 13:53
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  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 09:10 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