Java将8位数字转换为10位数字

标签 java bit-manipulation bytebuffer bitset

正在从 ByteBuffer 中读取数据,但我需要的值存储为 10 位。即:

1100101110 = 814

I've tried using BitSet but this stores each byte in LSB first, which causes the final two bits to be incorrect the above example turns into:

1101001111 = 815

an example using a sequence of numbers:

                     8 bit    10 bit
01 02 03 04 05 06 07 08 | 09 10 | 11 12 13 14 15 16

最终会是:

                     8 bit    10 bit
08 07 06 05 04 03 02 01 | 16 15 | 14 13 12 11 10 09

因此,我可以按任一顺序管理第一个字节,但最后两位是从下一个字节的错误端获取的。

我当前的代码如下:

// bb stands for the ByteBuffer in use.
//length stands for the number bytes covering the 10 bit numbers
BitSet data = getBitSet(bb, length);
int totalNumbers = data.length() / 10;
int[] numbers = new int[totalNumbers];
for (int i=0; i < totalNumbers; i++){
    int start = i*10;
    int end = (i+1)*10;
    BitSet bs = data.get(start, end);
    int tenBitNumber = 0;
    for (int j = bs.nextSetBit(0); j >= 0; j = bs.nextSetBit(j+1)) {
        double power = pow(2, 9-j);
        tenBitNumber += power;
    }
    numbers[i] = tenBitNumber;
}

大端格式的有效示例: 字节序列:

11001011|10110111|00101100|11000111

使用BitSet时会转换为:

11010011|11101101|00110100|11100011

最好的解决方案是什么?我需要从 ByteBuffer 读取多个 10 位长度的数字。

最佳答案

首先,让我们处理有 5 个字节(40 位,或 4 个十位数字)可用的情况:将输入分成 5 个字节的 block 。每个 block 将产生一组四个 10 位数字:

int[] convertFive(byte a, byte b, byte c, byte d, byte e) {
    int p = ((a & 0xff) << 2) | (b & 0xc0) >>> 6;
    int q = ((b & 0x3f) << 4) | (c & 0xf0) >>> 4;
    int r = ((c & 0x0f) << 6) | (d & 0xfc) >>> 2;
    int s = ((d & 0x03) << 8) | (e & 0xff) >>> 0;
    return new int [] { p, q, r, s }; 
}

将这四个 int 添加到输出中以产生最终结果。您可以修改该方法以随时追加输出,而不是始终创建四元素数组。

以类似的方式处理剩余的小于5个字节的 block :两个字节变成一个10位数字,三个字节变成两个数字,四个字节变成三个数字。如果余数为一字节,则输入无效。

关于Java将8位数字转换为10位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996685/

相关文章:

c - 作业帮助(位操作)

java - 调用 jar 的 main 方法时出现 OutOfMemoryError

java - 检查我的应用程序的通知是否正在运行

lisp - 如何将给定八位位组(字节)的最后 n 位设置为零?

python - 如何将 27 个字节的数组(其中每 3 个字节是一个 2 的补码)转换成它的等效数字?

java - 如何将 OutputStream 中的数据放入 ByteBuffer?

android - 如何使用 ByteBuffer(无颜色校正)获取 RGB 位图?

java - 有没有办法在 Java 中 gzip 一个字节缓冲区?

java - 无法找到 'struts.multipart.saveDir' 属性设置。默认为 javax.servlet.context.tempdir

java - C++ 和 Java 性能