有人可以告诉我如何将 ByteBuffer 转换为 long[] 吗?
我首先有一个 long[],我使用以下代码将其转换为 ByteBuffer:
byte[] convertToByteArray(long[] data) {
ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 8);;
LongBuffer longBuffer = byteBuffer.asLongBuffer();
longBuffer.put(data);
return byteBuffer.array();
}
我现在想做相反的事情,并编写一些测试来比较转换前后的各种数组。
我尝试了以下操作,但在 JDK 1.6.0_26 上失败并出现 NPE:
long[] convertToLongArray(byte[] bArray) {
ByteBuffer byteBuffer = ByteBuffer.wrap(bArray);
LongBuffer longBuffer = byteBuffer.asLongBuffer();
return longBuffer.array();
}
问候, 肉山
最佳答案
在我这边它抛出
Exception in thread "main" java.lang.UnsupportedOperationException
at java.nio.LongBuffer.array(LongBuffer.java:994)
at test.convertToLongArray(test.java:11)
at test.main(test.java:15)
这样做是因为 byteBuffer.asLongBuffer()
调用返回的实例是 ByteBufferAsLongBufferL
或 ByteBufferAsLongBufferB
类(取决于印度) 。
这两个类都是 LongBuffer 的子类,并且在构造函数调用中调用 super
构造函数时不使用 long array 参数。
正如 @Kayaman 提到的,这些只是 ByteBuffer 中字节数组的 View 。
下面是从 ByteBufferAsLongBufferL
构造函数调用的 super 构造函数。请注意 null
参数。
LongBuffer(int mark, int pos, int lim, int cap) { // package-private
this(mark, pos, lim, cap, null, 0);
}
最好的选择是这样做:
long[] convertToLongArray(byte[] bArray) {
ByteBuffer byteBuffer = ByteBuffer.wrap(bArray);
LongBuffer longBuffer = byteBuffer.asLongBuffer();
long l[] = new long[longBuffer.capacity()];
longBuffer.get(l);
return l;
}
关于java - 如何在 Java 中将 ByteBuffer 转换为 long[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19003231/