我正在尝试将字节数组转换为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"填充未指定的字节。那么为什么会发生异常呢?我该如何解决?
答案 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用于将缓冲区从读取模式转换为写入模式,或者通过将限制重置为当前位置来写入读取模式。
如果您注释掉该行,它将正常工作。