In VB gibt es die Bitarray-Klasse (Namespace: System.Collections), um auf einzelne Bits direkt zugreifen zu können. Diese Klasse bietet die Möglichkeit, durch Umsetzung der 'Length'-Eigenschaft die Anzahl der enthaltenen Bits zu verringern bzw. False-Bits hinten anzuhängen. Dabei ist Vorsicht geboten. Die 'CopyTo'-Methode der 'Bitarray'-Klasse reagiert auf Veränderungen der Länge nicht korrekt, wenn das Array länger als 32 Bit ist. Beim Kürzen auf eine Länge, die nicht durch 8 teilbar ist, wird beim Kopieren das dadurch 'zerschnittene' letzte Byte noch vollständig mitkopiert. Das gilt auch für den letzten Integer-Wert bei Übertragung der Bits per 'CopyTo' in ein Integer-Array. Interessant: Beim Kopieren der Bitfolge in ein Boolean-Array findet eine Konvertierung statt, vermutlich deshalb tritt das Phänomen hier nicht auf. Das Boolean-Array wird korrekt entsprechend der neuen Bitarray-Länge gefüllt. Vergrößert man die Länge des Bitarray wieder, werden die False-Bits korrekt angehängt. Das Phänomen verschwindet. Die BitArray-Klasse ist offenbar eine Art 'Zwitter' zwischen Collection und Array. Die Elemente eines Bitarray bestehen nicht aus einer VB-Struktur oder einer VB-Klasse, sondern repräsentieren 'echte' Bits. Laut VB-Dokumentation verwendet die Methode 'BitArray.CopyTo' intern 'Array.Copy'. Dim bytes(7) As Byte ' 8 Bytes = 64 Bit Dim int_arr(1) As Int32 ' 2 Integer = 64 Bit Dim bol_arr(64) As Boolean ' 1 Bit --> 1 Boolean Dim ba64 As New Collections.BitArray(64) ' 8 Byte Dim ba52 As New Collections.BitArray(52) ' 6,5 Byte For i As Integer = 0 To ba64.Count - 1 ba64(i) = True If i < ba52.Count Then ba52(i) = True Next i ReDim bytes(7), int_arr(1), bol_arr(63) ba64.CopyTo(bytes, 0) ' alle Bytes = 255 ba64.CopyTo(int_arr, 0) ' -1, -1 ba64.CopyTo(bol_arr, 0) ' alle Booleans = true ReDim bytes(7), int_arr(1), bol_arr(63) ba52.CopyTo(bytes, 0) ' 7.Byte = 15, 8. Byte = 0 ba52.CopyTo(int_arr, 0) ' -1, 1048575 ba52.CopyTo(bol_arr, 0) ' 52 Booleans true, dann false ' Das Phänomen ..... ReDim bytes(7), int_arr(1), bol_arr(63) ba64.Length = 52 ' Bitarray kürzen If ba64.Count <> 52 Then Stop ba64.CopyTo(bytes, 0) ' 7. Byte = 255, 8. Byte = 0 ba64.CopyTo(int_arr, 0) ' -1, -1 ba64.CopyTo(bol_arr, 0) ' 52 Booleans true, dann false ' .... verschwindet auch wieder - jetzt passt alles ReDim bytes(7), int_arr(1), bol_arr(63) ba64.Length = 64 ' Länge zurücksetzen = false-Bits anhängen ba64.CopyTo(bytes, 0) ' 7. Byte = 15, 8. Byte = 0 ba64.CopyTo(int_arr, 0) ' -1, 1048575 ba64.CopyTo(bol_arr, 0) ' 52 Booleans true, dann false Dieser Tipp wurde bereits 9.464 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
TOP! Unser Nr. 1 Neu! sevDataGrid 3.0 Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |