Wie kann ich umwandeln von bits in bytes?
Ich habe ein array von 128 Boolesche Werte repräsentieren bits. Wie kann ich umwandeln diese 128-bit-Darstellungen in 16 bytes?
Beispiel:
Ich habe ein array, dass wie folgt aussieht:
0110001100110000100010111011001011010011010001010001101101001100
1000010000000000001000111111111101000011111001111011111011111001
(Umgerechnet auf 1s und 0s, um präziser)
Ich konvertieren müssen diese bits auf den folgenden byte-array:
99 48 139 178 211 69 27 76 132 0 35 255 67 231 190 249
EDIT: scheint nicht zu funktionieren:
public byte[] ToByteArray() {
int numBytes = Count / 8;
if (_bits.Count % 8 != 0) numBytes++;
byte[] bytes = new byte[numBytes];
int byteIndex = 0, bitIndex = 0;
for (int i = 0; i < _bits.Count; i++) {
if (_bits[i])
bytes[byteIndex] |= (byte)(1 << bitIndex);
bitIndex++;
if (bitIndex == 8) {
bitIndex = 0;
byteIndex++;
}
}
return bytes;
}
It-Ausgänge:
198 12 209 77 203 162 216 50 33 0 196 255 194 231 125 159
- Sie können die Beseitigung der 'byteIndex' variable mithilfe der modulo-operator ( % ). bytes[bitIndex % 8]
- Ich vermute, Sie wollten integer-division. Modulo verwendet werden, die auf der rechten Seite der Zuweisung.
bytes[bitIndex / 8] |= (byte)(1 << (bitIndex % 8))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code ist die Behandlung der ersten Bits, wie das low-bit des Wortes, so dass man jedes Wort umgedreht. Als quick-and-dirty-fix, versuchen Sie dies:
Dass setzt das erste bit im array an der höchsten position in das erste byte, etc.
Ich weiß nicht, ob es eine automatische Möglichkeit, es zu tun, aber Sie können es mit einem einfachen Algorithmus.
Einfachen Algorithmus:
Erstellen Sie ein array von bytes, die als Ausgabe-Puffer und initialisiert alle bytes auf 0. Die Größe dieses Arrays sollte auf der Grundlage der Länge der Eingabe boolean-array: ceil(bool_array_length /8.0)
Deklarieren Sie eine index-variable verwendet werden, wie Ihre aktuelle byte, und legen Sie es auf 0. Diese enthält den index in der Ausgabe-Puffer.
Iteriert über jedes element in der Eingabe boolean-array.
3.1. Links bit-Verschiebung die Zahl 1 durch die array-index-mod-8. Rufen Sie diese Nummer an Ihre Maske.
3.2. Berechnen Sie Ihre byte-index, wie Ihre aktuelle index in der array-div-8.
3.3. Wenn Sie einen booleschen
true
Wert des aktuellen index in der Eingabe boolean-array, einbitwise OR
mit Ihrem aktuellen byte und Maske.EDIT: Eigentlich ist diese auch zurück:
Wrong endianness? Ich lasse die Antwort trotzdem, für die Referenz.
BEARBEITEN: Sie können BitArray.CopyTo() durch Umkehrung des arrays etwa so:
Versuchen, diese Funktion (geschrieben als eine Erweiterung Methode).
Hinweis: Es schlägt fehl, wenn die Anzahl der bits (bools) ist kein Vielfaches von 8, aber die Beurteilung durch Ihre Frage, dies ist nicht der Fall. Es braucht nur eine sehr kleine modificaiton zu ermöglichen bit-arrays beliebiger Länge.