我有这个包含以下内容的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
我现在对溢出或其他例外不感兴趣。
我的方法有什么问题,我有什么替代方案?
答案 0 :(得分:2)
问题是,你们都陷入了所有那些神秘的逆转之中。 BitArray
的{{1}}格式不符合您byte[]
的格式,而且它正在咬你。
似乎您对数据的解释是“最高位有索引0”,最低位h。您需要映射的是“最高位是正确的,和每个字节都是低端”。
我建议完全摆脱那个帮助代码。问题是您使用了错误的格式来初始化byte[]
- 显而易见的解决方案是修复输入,而不是创建辅助方法来“重新映射”每次访问的索引。
获得所需结果的最简单方法是
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;
}
字节数组将使各个字节中的位成行(也就是说,你在每个单独的字节中摆脱了“反向”顺序),它将翻转位的顺序,全部在一个操作中。
输出Reverse
的额外反转是为了匹配样本中的顺序 - 我认为它实际上是不必要的,因为这是你手动渲染的位,而不是你想要使用它们的顺序。如果您只使用temp[temp.Length - t - 1]
,则第一个temp[t]
将对应于第36位,最后一个对应于第50位。这也意味着您可能不再需要使用辅助函数 - 只需使用{ {1}}获得第36位。
答案 1 :(得分:0)
实际上我不知道你是如何计算这些位以及位[36,50]将如何计算为“00000000 101011”。但这是我的答案:我会这样写这样的函数:
private static bool[] GetBitSBiArray(BitArray ba, int from, int to)
{
//from and to are zero-based
//you can change it the way you prefer.
if (to < from || to >= ba.Length)
return null;
List<bool> temp = new List<bool>();
int t = 0;
for (int i = from; i < to; i++)
temp.Add(ba.Get(i));
return temp.ToArray();
}