我有这个 BitArray,其中包含以下内容:
byte[] myBytes = {0, 0, 2, 176, 168, 3, 19, 0};
BitArray myBitArr = new BitArray(myBytes);
结果在显示器上受到了一些尊重:(编辑:这不是问题)
00000000 00000000 01000000 00001101 00010101 11000000 11001000 00000000
尊敬,是:
00000000 000000**00 00000010 1011**0000 10101000 00000011 00010011 00000000
为了从 myBitArr
中获取位,我使用以下代码
bool[] myNumbers = GetBitSBiArray(myBitArr, 36, 50);
用这个帮助方法
private static bool[] GetBitSBiArray(BitArray ba, int from, int to)
{
bool[] temp = new bool[to - from];
int t = 0;
for (int i = ba.Length - to; i < ba.Length - from; i++)
{
temp[t] = ba.Get(i);
t++;
}
return temp;
}
上面的方法以某种方式返回错误的结果:
00010000 000000 (14bit)
正确的结果是:
00000000 101011 (14bit) or 43
我现在对溢出或其他异常不感兴趣。
我的方法有什么问题,我有什么替代方案?
最佳答案
问题是,你陷入了所有这些神秘的逆转之中。 BitArray
的 byte[]
格式与您的 byte[]
格式不符,它会困扰您。
看来你对数据的解释是“最高位索引为0”,最低位为h。您需要映射到的是“最高位是正确的,并且每个单独的字节都是低端字节序”。
我建议完全删除该帮助程序代码。问题是您使用了错误的格式来初始化 BitArray
- 明显的解决方案是修复输入,而不是创建辅助方法来“重新映射”每次访问的索引。
获得您想要的结果的最简单方法是
BitArray myBitArr = new BitArray(myBytes.Reverse().ToArray());
以及方法
private static bool[] GetBitSBiArray(BitArray ba, int from, int to)
{
bool[] temp = new bool[to - from];
int t = 0;
for (int i = from; i < to; i++)
{
temp[temp.Length - t - 1] = ba.Get(i);
t++;
}
return temp;
}
这个想法是,反转
字节数组将使各个字节中的位对齐(也就是说,您消除了每个单独字节中的“相反”顺序),并且它将翻转位的顺序,所有操作都在一次操作中。
输出上的 temp[temp.Length - t - 1]
的额外反转是为了匹配示例中的顺序 - 我认为它实际上是不必要的,因为这是您对位的手动渲染,而不是您想要使用它们的顺序。如果您仅使用 temp[t]
,第一个 bool
将对应于位 36,最后一个对应于位 50 .这也意味着您可能不再需要使用辅助函数 - 只需使用 bitArray.Get(36)
即可获取位 36。
关于c# - 如何将 byte[] 转换为 BitArray,然后从 BitArray 中选取特定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32118687/