AW: Open For Binary - Single Datentyp
06.09.2005 14:19:12
IngGi
Hallo Heiko,
das ging jetzt schneller, als gedacht. Es funktioniert bei mir. Ich musste noch ein paar kleine Änderungen vornehmen, aber jetzt hat er mir zumindest deine beiden Beispielzahlen korrekt bearbeitet, von der 32-Bitstruktur über Mantisse, Basis und Exponent bis hin zur Realzahl. Ich habe dir hier die Funktion und das aufrufende Makro nochmal eingestellt. Möglicherweise hapert es jetzt noch an deinen Realdaten. Die Dateien, die du mir beim letzten Mal hochgeladen hast, haben nämlich einen Vorlauf. Den müsste man eventuell noch umkurven. Gib mir dann nochmal Bescheid.
Private Function cSingle(Byte0 As String, Byte1 As String, Byte2 As String, Byte3 As String) As Single
Dim mant As Single
Dim exp As Integer
Dim vorz As Byte
Dim i As Integer
'Single Datentyp nach IEEE754
'Bit 0 bis 22 = Nachkommateil der Mantisse, Vorkommateil = 1
'Bit 23 bis 30 = Exponent, Basis = 2
'bit 31 = Vorzeichenflag: 0=positiv 1=negativ
'Exponent versetzt dargestellt, d.h. tatsächlicher Exponent = dargestellter Exponent - 127
'Höchstwertigstes Bit von Byte2 = niederwertigstes Bit des Exponenten
'Daher wenn gesetzt, aus Byte2 und damit aus der Mantisse rausrechnen
If Asc(Byte2) > 127 Then Byte2 = Chr(Asc(Byte2) - 127)
'Die Mantisse ergibt sich damit aus dem Vorkommaanteil 1 plus
'Byte0 (Wertigkeit:1/8388608) + Byte1 (Wertigkeit:1/32768) + Byte2 (Wertigkeit:1/128),
'wobei das höchstwertige Bit von Byte2 ja schon rausgerechnet ist (gehört zum Exponenten)
'Bei den Wertigkeiten ist bereits berücksichtigt, dass die Mantisse wegen der Überlappung
'der 32-Bit-Struktur in den 4 Bytes um 1 Bit nach links verschoben werden muss.
mant = 1 + (Asc(Byte0) / 8388608) + (Asc(Byte1) / 32768) + (Asc(Byte2) / 128)
'Zur Berechnung des Exponenten zunächst das höchstwertige Bit von Byte3 rausrechnen,
'wenn gesetzt
If Asc(Byte3) > 127 Then Byte3 = Chr(Asc(Byte3) - 127)
'Den Wert von Byte3 jetzt um 1 Bit nach links rücken und an exp übergeben
exp = Asc(Byte3) * 2
'Das höchstwertige Bit von Byte3 ist das Vorzeichenflag und muß, wenn gesetzt,
'rausgerechnet werden
If Asc(Byte3) > 127 Then exp = exp - 127
'Das höchstwertige Bit von Byte2 ist das niederwertigste Bit des Exponenten
'und muss, wenn gesetzt, reingerechnet werden
If Asc(Byte2) > 127 Then exp = exp + 1
'Der Exponent ist laut IEEE754 versetzt dargestellt und muss daher um 127 verringert werden
exp = exp - 127
'Singlewert = Mantisse * Basis hoch Exponent
If exp > 1 Then
cSingle = 2 'Basis an cSingle übergeben
For i = 1 To exp - 1
cSingle = cSingle * 2 'Basis entspr. dem Exponenten (exp-mal) mit sich selbst multiplizieren
Next 'i
cSingle = cSingle * mant 'und schließlich noch mit der Mantisse
ElseIf exp = 1 Then
cSingle = mant
Else
cSingle = 0
End If
'Wenn Vorzeichenflag gesetzt, Wert negieren
If Asc(Byte3) > 127 Then cSingle = cSingle * (-1)
End Function
Sub open_binary()
Dim B0 As String
Dim B1 As String
Dim B2 As String
Dim B3 As String
Dim name As String
Dim value As Single
Dim ff As Byte
ff = FreeFile
name = "c:\test.raw"
Open name For Binary As #ff
While Not EOF(1)
B0 = Input(1, #ff)
B1 = Input(1, #ff)
B2 = Input(1, #ff)
B3 = Input(1, #ff)
value = cSingle(B0, B1, B2, B3)
Wend
Close #ff
End Sub
Gruß Ingolf