Rubrik: Variablen/Strings · Array/ArrayList | VB-Versionen: VB2005, VB2008 | 07.04.09 |
BitArray.CopyTo: Unerwartetes Verhalten Nach dem Verkürzen der Länge eines Bitarray reagiert die CopyTo-Methode evt. unerwartet | ||
Autor: Manfred Bohn | Bewertung: | Views: 9.468 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
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