我试图将字节数组转换为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"填充未指定的字节。那么,为什么会出现异常呢?我该怎么修?
getLong()
的规范特别指出,如果there are fewer than eight bytes remaining in this buffer
,则抛出BufferUnderflowException
。您的缓冲区只有两个字节。
似乎应该使用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
ArrayList
可能有一个Object[16]
,但这并不意味着它的逻辑大小大于您添加的元素数量。缓冲区中需要八个字节才能从中读取long
如果您试图将该字节数组用作无符号short,只需将前导零字节写入缓冲区即可。不过,如果只有两个字节,就不知道为什么要在int上加一个long。
这里的问题是-:buffer.flip()
flip用于通过将限制重置为当前位置来将缓冲器从读到写模式或从写到读模式翻转。
如果你把这句话删掉,它会很好用的。