2010-03-30 5 views

답변

40

명백한 방법; 바이트 배열을 취하는 생성자를 사용하여 :

그것은 당신이 BitArray 클래스의 인스턴스를 의미하는 경우 "비트 배열"... 무슨 뜻인지에 따라 달라집니다
BitArray bits = new BitArray(arrayOfBytes); 
+0

기존 비트 배열은 어떻게됩니까? – Sir

13

, Guffa의 대답은 잘 작동합니다.

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

귀하의 답변이 위의 답변보다 더 적합합니다. 결과에 선행 0이 포함되어 있습니다. +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

그냥 궁금해서 .. 그는 그 기능을 다른 방식으로 원하지 않니? !! –

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

당신은 스트림을 만들 BitArray을 사용할 수 있습니다 : 당신이 실제로 인스턴스에 대한 bool[]의 형태로 비트의 배열을 원하는 경우

, 당신은 그런 일을 할 수 배열의 비트 수는 byte입니다. 여기 예 :

string testMessage = "This is a test message"; 

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

BitArray messageBits = new BitArray(messageBytes); 
관련 문제