web-dev-qa-db-fra.com

Convertir tableau d'octets en tableau de bits?

Comment pourrais-je convertir un bytearray en un tableau de bits?

27
cam

La manière évidente; en utilisant le constructeur qui prend un tableau d'octets:

BitArray bits = new BitArray(arrayOfBytes);
45
Guffa

Cela dépend de ce que vous entendez par "tableau de bits" ... Si vous parlez d'une instance de la classe BitArray, la réponse de Guffa devrait fonctionner correctement.

Si vous voulez réellement un tableau de bits, sous la forme d'un bool[] par exemple, vous pouvez faire quelque chose comme ça:

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;
    }
}
14
Thomas Levesque
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;
}
2
abhijtih
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
Pierre Contri

Vous pouvez utiliser BitArray pour créer un flux de bits à partir d'un tableau byte. Voici un exemple:

string testMessage = "This is a test message";

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

BitArray messageBits = new BitArray(messageBytes);
0
Hendrik Vis