如何在Java中将ByteBuffer转换为long []

时间:2013-09-25 11:05:59

标签: java nio

有人可以告诉我如何将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();
}

此致 罗斯汉

1 个答案:

答案 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()调用返回的实例是ByteBufferAsLongBufferLByteBufferAsLongBufferB类(取决于印度)。 这两个类都是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;
}