从字节数组获取一定范围的位

时间:2019-03-01 23:40:02

标签: java arrays byte bit-shift

我想从字节数组{0b00000001,0b00100011,0b00010001}获得特定范围的位并将其转换为另一个字节数组。例如,从左至右从第5位到第12位。 结果看起来像这个字节数组{0b00010010}。 不幸的是,我找不到一个更快的选项,然后逐个读取这些位并将它们附加到字符串生成器中,直到8,然后将其放入数组中。 希望有人能解决这个问题,谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用左右移位操作来执行此操作。这些会将字节转换为整数,因此需要将其转换回字节。

下面是一个基本示例。我使用从0开始的索引,因此为了测试您的示例,您将调用rangeOf(sourceByteArray,4,11)。此功能仅演示该方法;应该在范围上进行检查,它可能会更快。

public byte[] rangeOf(byte[] source, int start, int end){
        int firstSourceByte = start/8;
        int shift = start%8;
        int size = (end - start)/8;
        if ((end - start)%8>0) size++;
        byte[] returnArray = new byte[size];

        for(int i = 0; i < size; i++) {
            returnArray[i] = (byte) (source[firstSourceByte + i] << shift);
            returnArray[i] += (byte) (source[firstSourceByte + i +1] >> (8 - shift));
        }

        return returnArray;
    }

答案 1 :(得分:0)

不幸的是,您的方法只能正确解决第二个字节,不知道为什么:D 我从开始= 12到结束= 48对此字节数组进行了测试。

byte [] s = {(字节)0b01000000,(字节)0b00000000,(字节)0b00010011,(字节)0b00010000,(字节)0b11101100,(字节)0b00010001,(字节)0b11101100,(字节)0b00010001,(字节)0b11101100,(字节)0b00010001}

结果是这样的:

00000001 00110001 11111110 <-这不起作用 11000001 00001110

我发现使用BigInteger的另一个解决方案是使用rightShift和leftShift,直到此位在正确的位置以直接从字节数组中读取它。 感谢您的帮助!