32

How would I go about converting a bytearray to a bit array?

cam
  • 8,725
  • 18
  • 57
  • 81

6 Answers6

57

The obvious way; using the constructor that takes a byte array:

BitArray bits = new BitArray(arrayOfBytes);
Guffa
  • 687,336
  • 108
  • 737
  • 1,005
15

It depends on what you mean by "bit array"... If you mean an instance of the BitArray class, Guffa's answer should work fine.

If you actually want an array of bits, in the form of a bool[] for instance, you could do something like that :

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;
    }
}
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
  • 1
    Your answer is more appropriate than the answer above cos result contains leading zeros. +1 – Nolesh Jan 30 '13 at 05:06
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;
}
abhijtih
  • 21
  • 1
1

You can use BitArray to create a stream of bits from a byte array. Here an example:

string testMessage = "This is a test message";

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

BitArray messageBits = new BitArray(messageBytes);
Alejandro Montilla
  • 2,626
  • 3
  • 31
  • 35
1
byte number  = 128;
Convert.ToString(number, 2);

=> out: 10000000

Arghya Sadhu
  • 41,002
  • 9
  • 78
  • 107
  • 1
    Could you please provide a bit more detail of what you are doing and how it is working? – darclander Sep 06 '20 at 14:28
  • From the [documentation](https://learn.microsoft.com/en-us/dotnet/api/system.convert.tostring?view=net-7.0) >ToString(Byte, Int32) Converts the value of an 8-bit unsigned integer to its equivalent string representation in a specified base. – Francesco B. Dec 15 '22 at 15:17
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();
}