AW: Konvertierung IEEE 754 (8 Byte) --> Dezimal
31.05.2007 23:58:00
Nobbi
Nein, das funktioniert leider auch nicht. Damit bekomme ich dieselben falschen Werte wie mit meiner Methode. Ich hatte die Bytes nacheinander eingelesen, in Hex umgewandelt (das macht mein Makro sowieso für andere Zwecke) und dann an CDbl() verfüttert. Mit beiden Methoden bekomme ich viel zu große oder viel zu kleine Zahlen, oft auch mit falschem Vorzeichen.
Beispiel: Sollwert ist 138,538.
Die Bytefolge in der Datei ist (in Hex): 40 61 51 38 57 91 97 E4.
Dein Beispiel oben ergibt den Wert -3,736...E+176. Und das, obwohl da korrekt 8 Bytes eingelesen werden, das habe ich überprüft.
Ich vermute, daß Excel bzw. VBA hier erst noch eine Interpretation der eingelesenen Bytes vornimmt (z.B. als "normale" Hex-Zahl), bevor die eigentliche interne Speicherung als Double passiert.
Aber egal. Ich habe die Lösung selber gefunden. Folgendes stammt aus einem archivierten Usenet-Posting in microsoft.public.de.vb und funktioniert hervorragend (ich habe nur die Benennung der Typen und den Source-String verändert):
Public Type IEEEDouble
Value As Double
End Type
Public Type IEEEBytes
Bytes(7) As Byte
End Type
Public Sub Main()
Dim MD As IEEEDouble
Dim MB As IEEEBytes
Dim I As Long, J As Long
Dim Source As String
Source = "40615138579197E4"
For I = 15 To 0 Step -2
MB.Bytes(J) = CByte("&H" & Mid$(Source, I, 2))
J = J + 1
Next
LSet MD = MB
Debug.Print MD.Value
End Sub
So ganz 100-prozentig verstehe ich zwar noch nicht, was da passiert, aber der Trick ist wohl - neben der umgedrehten Reihenfolge der Bytes - daß hier eine direkte Konvertierung der Variablen im Speicher mittels LSet gemacht wird, damit Excel bzw. VB(A) nicht interpretierend dazwischenfunkt. Das geniale daran ist, daß sich diese Methode auch sehr leicht so modifizieren läßt, daß ich direkt die eingelesene Bytefolge auswerten kann, ohne sie erst in Hex umwandeln zu müssen, was mir sehr entgegenkommt.
Übrigens haben CDbl() und Co. bei mir auch mit umgedrehter Bytefolge keine vernünftigen Ergebnisse gebracht. Das hier scheint also wirklich der einzige Weg zu sein, "Interpretationen" der Zahlen zu verhindern.