将 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 });
我们有byte
10
(从右边算起):
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();
我有一个代码可以将 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 });
我们有byte
10
(从右边算起):
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();