Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Probleme beim Konvertieren von Hex to Float (https://www.delphipraxis.net/176944-probleme-beim-konvertieren-von-hex-float.html)

the3dcloser 5. Okt 2013 20:18

Probleme beim Konvertieren von Hex to Float
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Community,
ich bin neu hier und habe ein kleines Problem mit einem Programm:
Ich möchte aus einer Datei per TFileStream 4 Bytes auslesen lassen, und diese dann in eine Gleitkommazahl konvertieren. Als Ausgabe habe ich hier schlicht ein einfaches Editfeld genommen.

Delphi-Quellcode:
procedure TGEOtool.ExportGEOClick(Sender: TObject);
var GEO:TFileStream;
    A:Single;
begin

GEO:=TFileStream.Create('F:\Tools\GEOtool\Files\Autobahn.geo', fmOpenRead);
GEO.Position:=0;
GEO.Seek(311, sofromcurrent);
GEO.ReadBuffer(A, 4);
Edit1.Text:=FloatToStr(A);
GEO.Free;
end;
Problem an der ganzen sache: Delphi schmeißt mir die Zahl -4,17242134176377E-8 um die Ohren. an sich eigentlich eine gute Sache, da das Programm dann immerhin schonmal seine Arbeit tut. Wenn ich mir aber die Datei in einem Hex-Editor ansehe, die 4 Bytes ab 311 nehme und diese dann in einen Onlinekonverter (z.b: Ich bin ein Link) eingebe, kommt eine andere Zahl (45.050) heraus. Was mache ich also demnach falsch?

Hier noch ein Bild aus dem Hex-Editor (die betroffenen Bytes sind (sollten) markiert sein, d.h. 311-314):

himitsu 5. Okt 2013 20:47

AW: Probleme beim Konvertieren von Hex to Float
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich auf die ByteOrder achte, dann komm ich darauf, daß du was falsch machst, bzw. das Programm korrekt arbeitet.

PS:
Delphi-Quellcode:
GEO.Position:=0;
GEO.Seek(311, sofromcurrent);
Nja, abgesehn davon daß der Filestream, nach dem Öffnen, sich eh schon an Position 0 befindet...

Delphi-Quellcode:
GEO.Position := 311;
oder nur
Delphi-Quellcode:
GEO.Seek(311, soFromCurrent);
, bzw. wie wäre es mit soFromBeginning?

the3dcloser 5. Okt 2013 21:30

AW: Probleme beim Konvertieren von Hex to Float
 
Ok, heißt das, dass Delphi diese 4 Bytes immer von hinten einliest? Wie kann man dann einstellen, dass auch die Bytes 1und 2 dann "sign" und den "exponent" stellen?

Ansonsten schonmal danke für die Lösung.

PS: Wenn man Teile davon später in Schleifen packt, macht das dann schon etwas Sinn. Das GEO.Poition:=0 am Anfang soll nur zur Sicherheit dienen.

himitsu 5. Okt 2013 22:09

AW: Probleme beim Konvertieren von Hex to Float
 
Njain.

Bei der Darstellung mit 0x*****. bzw $****** ist Links das MSB (groß) und rechts das LSB (klein).

Die Variablen liegen aber andersrum im Speicher, als Links klein und Rechts groß. (somit liegen die unterschiedlichen ordinalen Typen praktisch übereinander)

Code:
11       =      $11 (Byte)
1122     =    $2211 (Word)
11223344 = $44332211 (LongWord)
^^ hier zeigt z.B. der Pointer drauf

OlafSt 5. Okt 2013 22:38

AW: Probleme beim Konvertieren von Hex to Float
 
Man nennt das ganze "Intel-Byteorder" (erst wird das Low-Byte, dann das High-Byte abgelegt). Im Gegensatz dazu gibt es noch die "Motorola-Byteorder", wo erst das High-Byte, dann das Low-Byte abgelegt wird.

himitsu 5. Okt 2013 22:58

AW: Probleme beim Konvertieren von Hex to Float
 
Oder Little-Endian und Big-Endian.

Bernhard Geyer 5. Okt 2013 23:48

AW: Probleme beim Konvertieren von Hex to Float
 
Zitat:

Zitat von the3dcloser (Beitrag 1230925)
Ok, heißt das, dass Delphi diese 4 Bytes immer von hinten einliest? Wie kann man dann einstellen, dass auch die Bytes 1und 2 dann "sign" und den "exponent" stellen?

Nein. Nicht Delphi macht das sondern der Prozessor gibt das vor. Lies dir am besten dazu den Wiki-Artikel durch.


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