从字节数组中获取一系列位

问题描述 投票:1回答:2

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

java arrays byte bit-shift
2个回答
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;
    }

0
投票

不幸的是你的方法只能解决每一个正确的字节,不知道为什么:D我用start = 12和end = 48的字节数组测试它。

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

结果是这样的:

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

我找到了使用rightShift和leftShift的BigInteger的另一个解决方案,直到这些位在正确的位置,直接从字节数组中读取它。谢谢你的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.