cam
cam

Reputation: 9043

Convert Byte Array to Bit Array?

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

Upvotes: 32

Views: 51862

Answers (6)

Song Lam Le
Song Lam Le

Reputation: 11

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

=> out: 10000000

Upvotes: 1

Hendrik Vis
Hendrik Vis

Reputation: 63

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

Upvotes: 1

Pierre Contri
Pierre Contri

Reputation: 11

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

Upvotes: 0

abhijtih
abhijtih

Reputation: 21

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

Upvotes: 2

Thomas Levesque
Thomas Levesque

Reputation: 292715

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

Upvotes: 16

Guffa
Guffa

Reputation: 700840

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

BitArray bits = new BitArray(arrayOfBytes);

Upvotes: 58

Related Questions