有人可以告诉我如何将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();
}
此致 罗斯汉
答案 0 :(得分:3)
在我这边抛出
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
构造函数时没有长数组参数。
正如@Kayaman所提到的,这些只是来自ByteBuffer的字节数组的视图。
下面是从ByteBufferAsLongBufferL
构造函数调用的超级构造函数。请注意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;
}