Kontakt
DSVGO
VB kennt leider keine einfache Möglichkeit, auf die einzelnen Bytes (je 8 Bits) eines Longs (32-Bits) zuzugreifen. Mit den unten vorgestellten Routinen wird dies ermöglicht.
Dim n As Long Dim b1 As Byte Dim b2 As Byte Dim b3 As Byte Dim b4 As Byte n = Bytes2Long(255, 123, 45, 67) Debug.Print n 'ergibt: -8704701 Long2Bytes n, b1, b2, b3, b4 Debug.Print b1, b2, b3, b4 'ergibt: 255 123 45 67 Long2Bytes &H11002200, b1, ,b3 Debug.Print b1, b3 'ergibt: 17 34
Bei der Umsetzung gibt es eigentlich nur ein Problem: Da das HSB (Highest Significant Bit) des Long-Datentyps zur Repräsentation des Vorzeichens dient, müssen die ggf. daraus resultierende Überläufe vermieden werden.
Diese Funktion "shiftet" die vier Bytes derart nach links, dass einfache Or-Operationen für die Berechnung genügen (Apropos: Der VB-Compiler übersetzt hier die Multiplikationen tatsächlich in echte Shift-Operationen des Prozessors; vgl. auch "Bit-Schiebereien"):
Public Function Bytes2Long( _ ByVal b1 As Byte, _ ByVal b2 As Byte, _ ByVal b3 As Byte, _ ByVal b4 As Byte _ ) As Long 'Nach HSB (Vorzeichen) unterscheiden: If b1 And &H80 Then Bytes2Long = (b1 And &H7F) * &H1000000 Or &H80000000 _ Or b2 * &H10000 _ Or b3 * &H100& _ Or b4 Else Bytes2Long = b1 * &H1000000 _ Or b2 * &H10000 _ Or b3 * &H100& _ Or b4 End If End Function
Diese Routine schneidet jeweils via And-Operator das passende Byte aus und "shiftet" das Resultat dann via Ganzzahl-Division (wird wieder in Prozessor-Shift übersetzt!) nach rechts:
Public Sub Long2Bytes( _ ByVal n As Long, _ Optional ByRef b1 As Byte, _ Optional ByRef b2 As Byte, _ Optional ByRef b3 As Byte, _ Optional ByRef b4 As Byte _ ) b1 = (n And &HFF000000) \ &H1000000 And &HFF b2 = (n And &HFF0000) \ &H10000 b3 = (n And &HFF00&) \ &H100 b4 = n And &HFF& End Sub
© Jost Schwider, 30.09.2002-30.09.2002 - http://vb-tec.de/bytelong.htm