我想从字节数组{0b00000001,0b00100011,0b00010001}获取特定的位范围,并将其转换为另一个字节数组。例如从第5位到第12位从左到右。结果看起来像这个字节数组{0b00010010}。不幸的是,我无法找到更快的选项,然后逐个读取这些位并将它们附加到字符串构建器直到8,然后将其放入数组中。希望有人能解决这个问题,谢谢。
您可以使用左右移位操作执行此操作。这些将把字节转换为整数,因此需要将它们转换回字节。
以下是一个基本的例子。我使用从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;
}
不幸的是你的方法只能解决每一个正确的字节,不知道为什么: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的另一个解决方案,直到这些位在正确的位置,直接从字节数组中读取它。谢谢你的帮助!