2017-08-18 3 views
0

Wie der Titel sagt, versuche ich, ein Byte-Array wieder in Byte-Array zurück zu Byte-Array zu konvertieren.Byte [] zu BitArray und zurück zu Byte []

Ich bin mir bewusst, dass Array.CopyTo() kümmert sich darum, aber die Byte-Array empfangen ist nicht das gleiche wie das Original aufgrund der wie BitArray Werte in LSB speichert.

Wie geht es in C#?

+0

Sie könnten etw tun. wie https://stackoverflow.com/questions/746171/best-algorithm-for-bit-reversal-from-msb-lsb-to-lsb-msb-in-c – CShark

Antwort

1

Dies sollte es tun

static byte[] ConvertToByte(BitArray bits) { 
    // Make sure we have enough space allocated even when number of bits is not a multiple of 8 
    var bytes = new byte[(bits.Length - 1)/8 + 1]; 
    bits.CopyTo(bytes, 0); 
    return bytes; 
} 

Sie können es überprüfen, wie ein einfaches Treiberprogramm unter

// test to make sure it works 
static void Main(string[] args) { 
    var bytes = new byte[] { 10, 12, 200, 255, 0 }; 
    var bits = new BitArray(bytes); 
    var newBytes = ConvertToByte(bits); 

    if (bytes.SequenceEqual(newBytes)) 
     Console.WriteLine("Successfully converted byte[] to bits and then back to byte[]"); 
    else 
     Console.WriteLine("Conversion Problem"); 
} 

Ich weiß, dass der OP der Array.CopyTo Lösung bekannt ist (das ähnlich ist, was Ich habe hier), aber ich sehe nicht, warum es Bit Order Probleme verursacht. FYI, ich verwende .NET 4.5.2, um es zu überprüfen. Und deshalb habe ich den Testfall zur Verfügung gestellt, die Ergebnisse

+0

Integer Division und + 1, ist das klarer als nur mit Decke? – Mardoxx

+1

@Mardoxx Sicher! Es ist ein ziemlich allgemeines Idiom. – Vikhram

+0

Ich würde annehmen, dass es auch richtiger ist! Nicht gehen müssen int-> real-> int – Mardoxx

0

zu bestätigen, um eine BitArray von byte[] erhalten Sie einfach den Konstruktor von BitArray verwenden können:

BitArray bits = new BitArray(bytes); 

Um die byte[] des BitArray zu bekommen es viele mögliche Lösungen . Ich denke, eine sehr elegante Lösung ist die Verwendung der BitArray.CopyTo Methode. Erstellen Sie einfach ein neues Array und kopieren Sie die Bits in: