2

有人可以让我知道如何将 aa 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();
}

问候,肉山

4

1 回答 1

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;
}
于 2013-09-25T11:24:58.820 回答