将 LongBuffer/IntBuffer/ShortBuffer 转换为 ByteBuffer

2022-09-03 00:11:27

我知道一种将字节/短/整数/长数组转换为ByteBuffer的快速方法,然后获得一个字节数组。例如,要将字节数组转换为短数组,我可以执行以下操作:

byte[] bArray = { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };

ByteBuffer bb = ByteBuffer.wrap(byteArray);
ShortBuffer sb = bb.asShortBuffer();
short[] shortArray = new short[byteArray.length / 2];
sb.get(shortArray);

生成一个短数组,如下所示:。[256, 0, 0, 0, 256, 0, 0, 0]

如何使用java.nio类进行反向操作?

现在我正在这样做:

shortArray[] = {256, 0, 0, 0, 256, 0, 0, 0};
ByteBuffer bb = ByteBuffer.allocate(shortArray.length * 2);
for (short s : shortArray) {
    bb.putShort(s);
}
return bb.array();

我得到原始字节数组。但是我想使用像ShortBuffer.asByteBuffer()这样的方法,而不是手动循环来做到这一点。[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

我发现了2001年向Sun提出的请求,但他们不接受;-((


答案 1

这又如何呢?:

    bb.asShortBuffer().put(shortArray);

然后包含您的数据。bb

完整代码

public class Test {
    public static void main(final String args[]) {
        short[] arr = { 256, 0, 0, 0, 256, 0, 0, 0 };
        for (byte b : F(arr)) {
            System.out.print(b);
        }
    }

    public static byte[] F(short[] arr) {
        java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(arr.length * 2);
        bb.asShortBuffer().put(arr);
        return bb.array(); // this returns the "raw" array, it's shared and not copied!
    }
}

答案 2

好吧,在声明中

ShortBuffer sb = bb.asShortBuffer();

AFAIK,你只是原始的一个视图。因此,您始终可以访问原始变量,并查看通过引用修改的数据。ShortBufferByteBufferByteBufferbbCharBuffersb

asCharBuffer的文档说:

[...]对此缓冲区内容的更改将在新缓冲区中可见,反之亦然 [...]