我在理解ByteBuffer以下场景中的语义时遇到困难:
int sizeOfDouble = 8;
int numberOfDoubles = 4;
ByteBuffer testBuf = ByteBuffer.allocateDirect(sizeOfDouble*numberOfDoubles);
testBuf.putDouble(0, 1.0);
testBuf.putDouble(1, 2.0);
testBuf.putDouble(2, 3.0);
testBuf.putDouble(3, 4.0);
for (int i = 0; i < numberOfDoubles; ++i) {
System.out.println("testBuf[" + i + "]: " + testBuf.getDouble(i));
}
Run Code Online (Sandbox Code Playgroud)
我希望看到我刚刚把ByteBuffer它打印到屏幕上的值.相反,我得到这个输出:
testBuf[0]: 4.959404759574682E-4
testBuf[1]: 32.50048828125
testBuf[2]: 32.125
testBuf[3]: 4.0
Run Code Online (Sandbox Code Playgroud)
第三个索引的值似乎符合我的预期:4.0.但为什么值和索引0,1和2与我插入的值(分别为1.0,2.0和3.0)不匹配?
我怀疑我误解了一些有关如何ByteBuffer工作的东西,但我无法在javadoc中找到它.
这是因为您的代码将索引视为doubles 数组中的索引.初始写入成功完成; 然后第二个写入除了第一个之外的字节; 第三个写再次覆盖字节,依此类推.最后一次写入的结果不会被覆盖,因此4.0完整无缺.
第一个参数表示缓冲区内的字节数组的索引,因此您需要将其乘以sizeOfDouble:
testBuf.putDouble(0*sizeOfDouble, 1.0);
testBuf.putDouble(1*sizeOfDouble, 2.0);
testBuf.putDouble(2*sizeOfDouble, 3.0);
testBuf.putDouble(3*sizeOfDouble, 4.0);
for (int i = 0; i < numberOfDoubles; ++i) {
System.out.println("testBuf[" + i + "]: " + testBuf.getDouble(sizeOfDouble*i));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |