从较小字节数组(Java)强制转换长

从较小字节数组(Java)强制转换长,java,Java,我试图将字节数组转换为long,但收到BufferUnderflowException 在调试模式下,我查看了缓冲区内部。它有一个内部字节数组,并用“0”填充未指定的字节。那么为什么会出现异常呢?如何修复它?getLong()的规范特别指出,如果此缓冲区中剩余的字节少于8个,则会抛出BufferUnderflowException。您的缓冲区只有两个字节。一个数组列表可能有一个对象[16],但这并不意味着它的逻辑大小大于您添加的元素数。缓冲区中需要八个字节才能从中读取long 如果试图将该字节数

我试图将字节数组转换为long,但收到BufferUnderflowException


在调试模式下,我查看了缓冲区内部。它有一个内部字节数组,并用“0”填充未指定的字节。那么为什么会出现异常呢?如何修复它?

getLong()的规范特别指出,如果
此缓冲区中剩余的字节少于8个,则会抛出
BufferUnderflowException
。您的缓冲区只有两个字节。

一个
数组列表可能有一个
对象[16]
,但这并不意味着它的逻辑大小大于您添加的元素数。缓冲区中需要八个字节才能从中读取
long


如果试图将该字节数组用作无符号短字符,只需将前导零字节写入缓冲区。不过,我不知道如果只有两个字节,为什么要在int上加上long

似乎应该使用
Long.BYTES
来填充
缓冲区。如果
字节[]
已用完,则可以切换到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);
走另一条路

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

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

翻转用于通过将限制重置为当前位置,将缓冲区从读写模式或写读模式翻转


如果你把这行注释掉,它会很好用。

谢谢你。你知道如何将剩余字节设置为零以避免这种异常吗?@KostyaKrivomaz你可以添加6个包含0.2的前导或尾随字节(基于你期望得到的结果)。这只是一个特殊的例子,字节数可以从1到8不等,然后从8中减去字节数,然后先写入那么多的零。谢谢,Elliot。我会听从你的建议。试着去评论flip——什么都没有改变。不管怎样,谢谢你的帮助)
45060
System.out.println(Integer.toHexString(45060));
b004