Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Bits / Long

Vier Bytes sind ein Long

Impressum
Kontakt
DSVGO

Einleitung

Problem

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.

Beispiele

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

Code / Quelltext

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.

Bytes2Long

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

Long2Bytes

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