将 BitArray 转换为字节

Converting BitArray to Byte

我有一个代码可以将 BitArray 值转换为 byte[] 值。我也从 Whosebug 获得了代码。

代码运行良好,我只是有一部分不明白。

当代码使用 BitArray.CopyTo()BitArray 复制到 Byte 时,byte 读数为 LSB 顺序

谁能帮我理解为什么转换后的字节是 LSB 顺序?

strBit (is a string value that consists of 1/0)
byte[] myByte = new byte[50];

List<string> list = Enumerable.Range(0, strBit.Length / 8)
    .Select(i => strBit.Substring(i * 8, 8))
    .ToList();

for (int x = 0; x < list.Count; x++)
{
    BitArray myBitArray = new BitArray(list[x].ToString().Select(c => c == '1').ToArray());
    myBitArray.CopyTo(myByte, x);
}

示例输出:

  strBit[0] = 10001111  (BitArray)

当转换为字节时:

  myByte[0] = 11110001 (Byte) (241/F1)

因为我们计算右边的位和左边的项目;例如

 BitArray myBitArray = new BitArray(new byte[] { 10 });

我们有byte10(从右边算起):

 10 = 00001010 (binary)
            ^
            second bit (which is 1)

当我们从左边开始计算相应数组的项目时:

 {false, true, false, true, false, false, false, false}
           ^
           corresponding second BitArray item (which is true)

这就是为什么如果我们想要返回一个 byte 的数组,我们必须 Reverse 每个 byte 表示,例如Linq解决方案

  using System.Collections;
  using System.Linq;

  ...

  BitArray myBitArray = ...

  byte[] myByte = myBitArray
    .OfType<bool>()
    .Select((value, index) => new { // into chunks of size 8
       value,
       chunk = index / 8 })
    .GroupBy(item => item.chunk, item => item.value)
    .Select(chunk => chunk // Each byte representation
      .Reverse()           // should be reversed   
      .Aggregate(0, (s, bit) => (s << 1) | (bit ? 1 : 0)))
    .Select(item => (byte) item)
    .ToArray();