如果您有 1、2、4 或 8 个字节,您只需使用 get()、getShort()、getInt() 和 getLong()。
有人可以帮助我使用逻辑来获得 3,5 或 7 个字节的 long 吗?我可能不得不以某种方式用零划桨。
如果您有 1、2、4 或 8 个字节,您只需使用 get()、getShort()、getInt() 和 getLong()。
有人可以帮助我使用逻辑来获得 3,5 或 7 个字节的 long 吗?我可能不得不以某种方式用零划桨。
这个问题的答案取决于数据的字节顺序。Java 的 ByteBuffer 类有一个 order(ByteOrder) 方法来设置字节顺序,但这对非标准长度的整数/长值没有帮助。
假设 bb 是一个 ByteBuffer 并且 length 是已知的数据长度。value 变量存储结果。
这是一个辅助函数,在下面的两个解决方案中都使用,并且是必需的,因为 Java 没有无符号数据类型(我觉得这很糟糕):
private static long getUnsigned(final byte b) {
if (b < 0) {
return (long) b + 256;
}
return b;
}
这是一个小端解决方案:
long value = 0;
for (int shift = 0; shift < length * 8; shift += 8) {
value |= getUnsigned(bb.get()) << shift;
}
这是一个大端的解决方案:
long value = 0;
for (int i = 0; i < length; ++i) {
value <<= 8;
value |= getUnsigned(bb.get());
}
当您将一个数字转换为另一个数字时,您将扩展最大值位。(换句话说,如果最高位为 1,则用 1 填充,如果最高位为 0,则用 0 填充)
所以在 little endian 中,你找到最高位(最右边字节中的最左边位),然后添加一个 FF 或 00 的字节。
例如,假设您有一个 3 字节的小端数:
0000 0000 | 0000 0000 | 1000 0000
您的最高位是 1(最后一个字节中的 1),因此,4 个字节的符号扩展结果是:
0000 0000 | 0000 0000 | 1000 0000 | 1111 1111
同样,如果 3 字节数是:
1111 1111 | 1111 1111 | 0101 1101
那么4字节符号扩展版就是:
1111 1111 | 1111 1111 | 0101 1101 | 0000 0000