将byte []转换为short [],使每个short元素包含13位数据

时间:2013-01-08 23:44:40

标签: java algorithm bit-manipulation

所以我正在开发一个解决方案,我需要将任何给定的数据类型分解为13位编码,我能够处理除字符串之外的所有其他内容。

因此,我希望对此进行编码。

将字符串转换为字节数组

收集短字节中的第一个字节,字节位移到13

将下一个字节的位移为5,或者使用短的位移以获得第一个短

迭代变得越来越麻烦我认为这种方法都是错误的。我可以获得可能的解决方案吗?

3 个答案:

答案 0 :(得分:2)

使用BigInteger。使用byte[]对其进行初始化。虽然它不为零,但使用and()方法屏蔽掉13位并通过intValue()转换为短值。用shiftRight()将它向右移13位并重复。

答案 1 :(得分:1)

OpenLR有一个二进制库here.

它有一个ByteArrayBitstreamInput类,在其构造函数中使用byte[]参数,然后可以使用getInt()获取任意数量的位并将其转换为short }。

答案 2 :(得分:1)

此代码经过轻微测试。它是一个低级解决方案,但它不会有太多开销(比如移动整个输入或垃圾生成或库膨胀)。

// Length of shorts array must be at least (8 * bytes.length + 12) / 13.
static void convert(byte[] bytes, short[] shorts) {
    int nBitsAvail = 13;
    int i = 0;
    for (byte b : bytes) {
        if (nBitsAvail >= 8) {
            // Entire byte fits in available space in short.
            shorts[i] = (short) ((shorts[i] << 8) | b);
            nBitsAvail -= 8;
        } else {
            // Byte must be split between bits remaining in this short and the next.
            int nBitsNeeded = 8 - nBitsAvail ;
            shorts[i] = (short) ((shorts[i] << nBitsAvail) | (b >> nBitsNeeded));
            shorts[++i] = (short) (b & (0xff >> nBitsAvail));
            nBitsAvail = 13 - nBitsNeeded;
        }
    }
    shorts[i] <<= nBitsAvail;
}