1

如果您有 1、2、4 或 8 个字节,您只需使用 get()、getShort()、getInt() 和 getLong()。

有人可以帮助我使用逻辑来获得 3,5 或 7 个字节的 long 吗?我可能不得不以某种方式用零划桨。

4

2 回答 2

2

这个问题的答案取决于数据的字节顺序。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());
}
于 2012-09-28T09:13:35.190 回答
2

当您将一个数字转换为另一个数字时,您将扩展最大值位。(换句话说,如果最高位为 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
于 2012-09-28T00:30:56.243 回答