![]() |
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:
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:
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; ![]() Hier noch ein Bild aus dem Hex-Editor (die betroffenen Bytes sind (sollten) markiert sein, d.h. 311-314): |
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:
Nja, abgesehn davon daß der Filestream, nach dem Öffnen, sich eh schon an Position 0 befindet...
GEO.Position:=0;
GEO.Seek(311, sofromcurrent);
Delphi-Quellcode:
oder nur
GEO.Position := 311;
Delphi-Quellcode:
, bzw. wie wäre es mit soFromBeginning?
GEO.Seek(311, soFromCurrent);
|
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. |
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 |
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.
|
AW: Probleme beim Konvertieren von Hex to Float
Oder Little-Endian und Big-Endian.
|
AW: Probleme beim Konvertieren von Hex to Float
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 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 by Thomas Breitkreuz