所以我正在开发一个解决方案,我需要将任何给定的数据类型分解为13位编码,我能够处理除字符串之外的所有其他内容。
因此,我希望对此进行编码。
将字符串转换为字节数组
收集短字节中的第一个字节,字节位移到13
将下一个字节的位移为5,或者使用短的位移以获得第一个短
迭代变得越来越麻烦我认为这种方法都是错误的。我可以获得可能的解决方案吗?
答案 0 :(得分:2)
使用BigInteger
。使用byte[]
对其进行初始化。虽然它不为零,但使用and()
方法屏蔽掉13位并通过intValue()
转换为短值。用shiftRight()
将它向右移13位并重复。
答案 1 :(得分:1)
它有一个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;
}