Convert Byte Array to Bit Array?

前端 未结 6 1961
抹茶落季
抹茶落季 2020-12-30 20:43

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

相关标签:
6条回答
  • 2020-12-30 21:18

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

    BitArray bits = new BitArray(arrayOfBytes);
    
    0 讨论(0)
  • 2020-12-30 21:18
    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;
    }
    
    0 讨论(0)
  • 2020-12-30 21:29
    byte number  = 128;
    Convert.ToString(number, 2);
    

    => out: 10000000

    0 讨论(0)
  • 2020-12-30 21:33

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-30 21:35

    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);
    
    0 讨论(0)
  • 2020-12-30 21:39
    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 讨论(0)
提交回复
热议问题