gpt4 book ai didi

c# - 如何将 byte[] 转换为 BitArray,然后从 BitArray 中选取特定位

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:34 27 4
gpt4 key购买 nike

我有一个包含以下内容的 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

我暂时对溢出或其他异常不感兴趣。

我的方法有什么问题,我有什么替代方法?

最佳答案

问题是,您会陷入所有这些神秘的逆转之中。 BitArraybyte[] 格式不适合你的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com