Преобразовать байтовый массив в битовый массив? - PullRequest
28 голосов
/ 30 марта 2010

Как мне преобразовать байтовый массив в битовый массив?

Ответы [ 5 ]

46 голосов
/ 30 марта 2010

Очевидный путь; используя конструктор, который принимает байтовый массив:

BitArray bits = new BitArray(arrayOfBytes);
14 голосов
/ 30 марта 2010

Это зависит от того, что вы подразумеваете под "битовым массивом" ... Если вы имеете в виду экземпляр класса BitArray, ответ Гуффы должен работать нормально.

Если вам действительно нужен массив битов, например, в форме bool[], вы можете сделать что-то подобное:

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;
    }
}
2 голосов
/ 31 августа 2012
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 голос
/ 20 декабря 2017

Вы можете использовать BitArray для создания потока битов из массива byte. Вот пример:

string testMessage = "This is a test message";

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

BitArray messageBits = new BitArray(messageBytes);
0 голосов
/ 30 марта 2016
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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...