如何将byte[]转换为BitArray,然后从BitArray中选择特定的位

本文关键字:BitArray 选择 然后 byte 转换 | 更新日期: 2023-09-27 18:08:59

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

我现在对溢出或其他异常不感兴趣。

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

如何将byte[]转换为BitArray,然后从BitArray中选择特定的位

问题是,你会陷入所有这些神秘的逆转中。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;
}

这个想法是,Reverse字节数组将把单个字节中的位对齐(也就是说,你摆脱了每个单独字节中的"反向"顺序),它将翻转位的顺序,所有这些都在一次操作中。

在输出上使用temp[temp.Length - t - 1]的额外反转是为了匹配示例中的顺序-我认为这实际上是不必要的,因为这是您手动渲染的位,而不是您想要使用它们的顺序。如果简单地使用temp[t],第一个bool将对应于第36位,最后一个对应于第50位。这也意味着您可能不再需要使用辅助函数-只需使用bitArray.Get(36)来获得36位。

实际上我不知道你是怎么计算这些位的,也不知道[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();
    }