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.465 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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. 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 Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. |
||||||||||||||||
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. |