从较小的字节数组(Java)转换为long

时间:2014-11-11 06:23:53

标签: java

我正在尝试将字节数组转换为long,但是接收 BufferUnderflowException

    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    byte[] arg1 = new byte[] {0x04, (byte)0xB0};
    buffer.put(arg1, 0, arg1.length);
    buffer.flip();
    long val = buffer.getLong();

在调试模式下,我查看了缓冲区内部。它有一个内部字节数组,用" 0"填充未指定的字节。那么为什么会发生异常呢?我该如何解决?

4 个答案:

答案 0 :(得分:5)

getLong()的规范明确指出,如果BufferUnderflowException,它会抛出there are fewer than eight bytes remaining in this buffer。你的缓冲区只有两个字节。

答案 1 :(得分:1)

您似乎应该使用Long.BYTES来填充buffer。如果byte[]用尽,您可以切换为0.赞,

ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
byte[] arg1 = new byte[] { 0x04, (byte) 0xB0 };
for (int i = 0; i < Long.BYTES; i++) {
    int pos = Long.BYTES - i - 1;
    byte val = (pos < arg1.length) ? arg1[pos] : 0;
    buffer.put(val);
}
buffer.flip();
long val = buffer.getLong();
System.out.println(val);

输出

45060

走另一条路

System.out.println(Integer.toHexString(45060));
b004

答案 2 :(得分:0)

ArrayList可能有Object[16],但这并不意味着其逻辑大小大于您添加的元素数量。缓冲区中需要8个字节才能从中读取long个字节。

如果您尝试将该字节数组用作无符号短路,则只需将前导零字节写入缓冲区。但是,如果它只是两个字节,那么不知道为什么你需要一个长的int。

答案 3 :(得分:0)

这里的问题是 - : 的 buffer.flip();

flip用于将缓冲区从读取模式转换为写入模式,或者通过将限制重置为当前位置来写入读取模式。

如果您注释掉该行,它将正常工作。