32

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

6 Answers 6

58

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

BitArray bits = new BitArray(arrayOfBytes);
Sign up to request clarification or add additional context in comments.

1 Comment

What about to a pre-existing bit array?
16

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;
    }
}

1 Comment

Your answer is more appropriate than the answer above cos result contains leading zeros. +1
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;
}

1 Comment

Just curious.. Doesn't he want the function the other way?!!
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);

Comments

1
byte number  = 128;
Convert.ToString(number, 2);

=> out: 10000000

2 Comments

Could you please provide a bit more detail of what you are doing and how it is working?
From the documentation >ToString(Byte, Int32) Converts the value of an 8-bit unsigned integer to its equivalent string representation in a specified base.
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();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.