将字节数组转换为位数组?

32

我该如何将一个bytearray转换为一个位数组?

6个回答

57

显而易见的方法是使用接受字节数组的构造函数:

BitArray bits = new BitArray(arrayOfBytes);

1
对于一个已存在的位数组怎么办? - Sir

15

这取决于你所说的“bit array”的含义...如果你指的是BitArray类的实例,Guffa的答案应该可以正常工作。

如果你实际上想要一个位数组,比如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;
    }
}

1
你的答案比上面的答案更合适,因为结果包含前导零。+1 - Nolesh

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

7
只是好奇,他不想将功能反过来吗?!! - Antony Thomas

1
你可以使用 BitArray 将一个 byte 数组转换为一串位。以下是一个例子:
string testMessage = "This is a test message";

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

BitArray messageBits = new BitArray(messageBytes);

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

=> 输出: 10000000


1
请问您能否提供更多关于您正在做什么以及它是如何工作的细节? - darclander
文档 >ToString(Byte, Int32) 将8位无符号整数的值转换为指定基数下的等效字符串表示形式。 - Francesco B.

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接