缓冲区分配14个字节时执行getLong时出现BufferUnderflowException异常

时间:2013-12-21 20:14:34

标签: java

非常小的代码但我对这种行为感到非常惊讶。我有一个14字节的密钥,它在一个字节数组中。我将这个字节数组放入一个ByteBuffer然后做一个getLong给我一个BufferUnderflowException。无法理解为什么?

    byte key[] = new byte[14];

    key[13] = (byte) 3;
    key[12] = (byte) 21;
    key[11] = (byte) 1;
    key[10] = (byte) 15;
    key[9]  = (byte) 66;
    key[8]  = (byte) 64;

    key[7]  = (byte) 3;
    key[6]  = (byte) 65;
    key[5]  = (byte) -10;
    key[4]  = (byte) -65;
    key[3]  = (byte) 3;
    key[2]  = (byte) 65;
    key[1]  = (byte) -10;
    key[0]  = (byte) -65;


    ByteBuffer b = ByteBuffer.allocate(14);
    b.put(key);
    long l = b.getLong();

2 个答案:

答案 0 :(得分:3)

ByteBuffer b = ByteBuffer.allocate(14);
b.put(key, 0, key.length);
long l = b.getLong(0); 

你应该在获得长

时指定索引

答案 1 :(得分:1)

在" put"的文档中其他字节缓冲区的方法阐明缓冲区的位置增加了put字节数。对于字节数组,这似乎是相同的。因此,在put操作之后,缓冲区中的位置为14,并且剩下0个字节以获得需要8个字节的长值。

java doc of" put":" [...]然后将两个缓冲区的位置递增n。 [...]"