【问题标题】:Java ByteBuffer classJava ByteBuffer 类
【发布时间】:2014-09-24 16:49:33
【问题描述】:

我正在从设备读取 byte[] 并尝试在 ByteBuffer 类的帮助下将其解释为 Java 中的整数数组,但我遇到了索引越界错误。看这里:

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??

【问题讨论】:

  • 你能发布一个简短但完整的程序来演示这个问题吗?
  • 我发现如果我在调用 byteBuffer.asIntBuffer() 之前执行 byteBuffer.position(0),它会起作用。必须这样做似乎很奇怪,但它确实有效。
  • 可能是因为ByteBuffer的位置改变了。在asIntBuffer 的javadoc 中:新缓冲区的内容将从该缓冲区的当前位置开始。此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。

标签: java bytebuffer


【解决方案1】:

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

ByteBuffer.asIntBuffer 的 JavaDoc 现在声明:

新缓冲区的内容将从该缓冲区的当前位置开始。

这意味着,例如,当你有一个容量为 16 个元素的ByteBuffer,而这个ByteBufferposition() 是4,那么生成的IntBuffer 将只代表剩余的12 个元素.

调用byteBuffer.put(bytes)后,字节缓冲区的位置提前(取决于字节数组的长度)。相应地,您正在创建的 IntBuffer 具有较小的容量。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多