2014-09-24 38 views
3

我正在从设备中读取一个字节[],并尝试在ByteBuffer类的帮助下将其解释为Java中的整数数组,但我得到的索引超出了界限错误。看这里:Java ByteBuffer类

byteBuffer.put(bytes); // put the array of bytes into the byteBuffer   

System.out.println("the value I want is " + byteBuffer.getInt(16*4)); // gives me the number I want, but I'd rather deal with an integer array like this: 

System.out.println("the value I want is " + byteBuffer.asIntBuffer().get(16)); // index out of bounds? Why?? 
+1

你可以发布一个简短但完整的程序来演示问题吗? – 2014-09-24 16:55:15

+0

我发现它的作品,如果我在调用byteBuffer.asIntBuffer()之前做了一个byteBuffer.position(0)。似乎很奇怪必须这样做,但它的工作。 – Barodapride 2014-09-24 16:57:07

+3

可能是因为ByteBuffer的位置发生了变化。在'asIntBuffer'的javadoc中:新缓冲区的内容将从这个缓冲区的当前位置开始。这个缓冲区内容的改变将在新缓冲区中可见,反之亦然;两个缓冲区的位置,限制和标记值将是独立的。 – user1071777 2014-09-24 16:58:10

回答

4

ByteBuffer类内部存储缓冲区的几个属性。最重要的是在缓冲区中的位置(虚拟“光标”)。这个位置可以用byteBuffer.position()来读取,并用byteBuffer.position(123);来写。

ByteBuffer.asIntBuffer的JavaDoc的现在状态:

新缓冲区的内容将开始在这个缓冲区的当前位置。

这意味着,例如,当你有一个ByteBuffer用容量为16个的元素,并在此position()ByteBuffer为4,然后将所得IntBuffer将仅代表剩余的12个元素。

在调用byteBuffer.put(bytes)之后,字节缓冲器的位置被提前(取决于字节数组的长度)。因此,您正在创建的IntBuffer的容量较小。

为了解决这个问题,在调用byteBuffer.put(bytes)之后,可以调用byteBuffer.rewind()byteBuffer.position(0)。 (哪一个更合适取决于预期的使用模式)