Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
728to732
728to732
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

single Gleitkommazahl in 4 Byte Hex umwandeln

single Gleitkommazahl in 4 Byte Hex umwandeln
06.02.2006 18:26:45
Heiko
Hallo,
habe noch immer ein recht kniffliges Problem: Es geht um die Umwandlung einer (IEEE754) Gleitkommazahl (Single) in 4 Byte Hex Code bzw. die entsprechenden 4 einzelnen Ascii Werte per VBA. Offensichtlich gibt es in Excel keine fertige Funktion hierfür bzw. nur "abgespeckte" Tabellenfunktionen. Bisher habe ich es hinbekommen, die einzelnen Werte für Vorzeichen, Mantisse und Exponent zu berechnen und dies dann in Form von Bits darzustellen. Anschließend habe ich die 32 Bit-Kette in 4 mal 8 Bits zerhackt und daraus wiederum dann die einzelnen Hex-Werte berechnet.
Es funktioniert zwar, ist aber irgendwie nicht richtig "elegant". Kennt jemand eine einfachere Methode bzw. einen richtigen Algorithmus?
Danke im voraus,
Heiko

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: single Gleitkommazahl in 4 Byte Hex umwandeln
07.02.2006 21:16:58
bst
Abend Heiko,
vermutlich geht's elegant nur durch Umkopieren des Single's in ein Bytearray.
Dazu brauchst Du API und die in VBA undokumentierte VarPtr-Funktion.
Alternativ könnte es auch gehen (ungetestet!) den Single in eine Binärdatei zu schreiben und in ein Byte-Array zurückzulesen.
Übrigens, wie hast Du das denn gemacht ??
HTH, Bernd
--
Option Explicit
Private Declare

Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Dest As Any, Src As Any, ByVal ByteLen As Long)
Type tGKZ
vorzeichen As Byte
exponent As Integer
mantisse As Long
End Type

Function ByteArr2GKZ(b() As Byte, gkz As tGKZ) As Boolean
gkz.vorzeichen = IIf((b(3) And 128) = 0, 0, 1)
gkz.exponent = CInt((b(3) And 127)) * 2 + IIf((b(2) And 128) = 0, 0, 1)
gkz.mantisse = (CLng(b(2)) And 127) * 256 * 256 + CLng(b(1)) * 256 + CLng(b(0))
ByteArr2GKZ = True
End Function


Sub x()
Dim s As Single, b(0 To 3) As Byte, gkz As tGKZ
s = 13.5
CopyMemory ByVal VarPtr(b(0)), ByVal VarPtr(s), 4
Debug.Print b(3), b(2), b(1), b(0)
Call ByteArr2GKZ(b, gkz)
Debug.Print gkz.vorzeichen, gkz.exponent, gkz.mantisse
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige