2010-03-30 15 views

risposta

40

Il modo ovvio; utilizzando il costruttore che prende un array di byte:

BitArray bits = new BitArray(arrayOfBytes); 
+0

Che dire di un array di bit preesistente? – Sir

13

Dipende da cosa si intende per "matrice di bit" ... Se vuoi dire un'istanza della classe BitArray, la risposta di Guffa dovrebbe funzionare bene.

Se si desidera veramente una serie di bit, sotto forma di un bool[] per esempio, si potrebbe fare qualcosa di simile:

byte[] bytes = ... 
bool[] bits = bytes.SelectMany(GetBits).ToArray(); 

... 

IEnumerable<bool> GetBits(byte b) 
{ 
    for(int i = 0; i < 8; i++) 
    { 
     yield return (b & 0x80) != 0; 
     b *= 2; 
    } 
} 
+1

La risposta è più appropriata della risposta sopra perché il risultato contiene gli zeri iniziali. +1 – Nolesh

2
public static byte[] ToByteArray(this BitArray bits) 
{ 
    int numBytes = bits.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 << (7 - bitIndex)); 
     bitIndex++; 
     if (bitIndex == 8) { 
      bitIndex = 0; 
      byteIndex++; 
     } 
    } 
    return bytes; 
} 
+6

Solo curioso .. Non vuole la funzione dall'altra parte? !! –

0
public static byte[] ToByteArray(bool[] byteArray) 
{ 
    return = byteArray 
       .Select(
        (val1, idx1) => new { Index = idx1/8, Val = (byte)(val1 ? Math.Pow(2, idx1 % 8) : 0) } 
       ) 
       .GroupBy(gb => gb.Index) 
       .Select(val2 => (byte)val2.Sum(s => (byte)s.Val)) 
       .ToArray(); 
} 
0

È possibile utilizzare BitArray per creare un flusso di bit da un array byte. Ecco un esempio:

string testMessage = "This is a test message"; 

byte[] messageBytes = Encoding.ASCII.GetBytes(testMessage); 

BitArray messageBits = new BitArray(messageBytes);