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

标签 java arrays byte bit-shift

我想从字节数组 { 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;
    }

关于java - 从字节数组中获取一系列位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953777/

相关文章:

java - 从 bin 文件夹加载类

c - 从 C 中的无符号整数打印一个字节

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 将 arraylist 中的每个值显示到每个 textView Android

javascript - 是否有将 SqlResultsetRowList 转换为数组的首选方法?

C 数组在 Windows 和 Ubuntu 上的处理方式不同

asp.net - System.Byte[] 在gridview 中显示而不是图像?

java - 如何像使用接口(interface)一样使用枚举?

java - HTTP 状态 500 - javax.servlet.ServletException : java. lang.NullPointerException

java - 我可以更改 typesafeEnumMemberName 生成的 bij cxf-xjc-plugin 吗?