Kontakt
DSVGO
VB kennt leider keine einfache Möglichkeit, auf die einzelnen Bytes (je 8 Bits) eines Words (16-Bits) zuzugreifen. Mit den unten vorgestellten Routinen wird dies ermöglicht.
Einfache Aufrufe sehen so aus:
Dim w As Integer Dim b As Byte w = Bytes2Word(1, 0) 'w = 256 (1*256+0) w = Bytes2Word(255, 255) 'w = -1 (alle Bits gesetzt) w = Bytes2Word(123, 45) 'w = 31533 (123*256+45) b = HiByte(w) 'b = 123 b = LoByte(w) 'b = 45
Das besondere an diesen Routinen ist, dass LoByte und HiByte in einer Zuweisung auch auf der linken Seite des Gleichheitszeichens stehen dürfen (ähnlich wie Mid$, s.a. "Texte wiederholen"). So kann auch ein einzelnes Byte in einem Word gesetzt werden:
HiByte(w) = 43 'w = 11053 (43*256+45) LoByte(w) = 21 'w = 11029 (43*256+21) HiByte(w) = 0 'w = 21 (0*256+21)
Um LoByte und HiByte auch für Zuweisungen nutzen zu können, werden sie nicht einfach als Funktionen sondern als Property-Prozeduren definiert.
Public Function Bytes2Word(ByVal HiByte As Byte, ByVal LoByte As Byte) As Integer If HiByte And &H80 Then Bytes2Word = (HiByte And &H7F) * &H100& Or LoByte Or &H8000 Else Bytes2Word = (HiByte * &H100&) Or LoByte End If End Function
Public Property Get LoByte(ByRef Word As Integer) As Byte LoByte = Word And &HFF End Property Public Property Let LoByte(ByRef Word As Integer, ByVal aByte As Byte) Word = Word And &HFF00 Or aByte End Property
Da das höherwertige Byte auch das Vorzeichen enthält, muss dieses berücksichtigt werden, um einen Überlauf zu vermeiden:
Public Property Get HiByte(ByRef Word As Integer) As Byte HiByte = (Word And &HFF00&) \ &H100 End Property Public Property Let HiByte(ByRef Word As Integer, ByVal aByte As Byte) If aByte And &H80 Then Word = Word And &HFF Or (aByte And &H7F) * &H100 Or &H8000 Else Word = Word And &HFF Or aByte * &H100 End If End Property
© Jost Schwider, 10.10.2001-10.10.2001 - http://vb-tec.de/byteword.htm