有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将字节[]转换为短[],使每个短元素包含13位数据

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

所以,当我开始编写代码时,我会采取一些步骤

将字符串转换为字节数组

在短时间内收集第一个字节,将字节的位移位为13

将下一个字节的位移位为5,或将下一个字节的位移位为short,以获得第一个short

迭代变得越来越麻烦,我认为这种方法是完全错误的。我能找到一个可能的解决方案吗


共 (3) 个答案

  1. # 1 楼答案

    使用BigInteger。用byte[]初始化它。当它不是零时,用and()方法屏蔽掉13位,并转换成短通孔intValue()。用shiftRight()将其向右移位13位,然后重复

  2. # 2 楼答案

    这段代码经过了少量测试。这是一个低级别的解决方案,但不会有太多开销(比如转移整个输入或垃圾生成或库膨胀)

    // 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;
    }
    
  3. # 3 楼答案

    OpenLR有一个二进制库here.

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