转换LongBuffer / IntBuffer / ShortBuffer到的ByteBuffer

2019-07-30 15:32发布

我知道一个快速的方法来转换一个字节/短/ INT /长数组的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();

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

我已经找到了到2001年太阳请求 ,但他们并没有接受它; - ((

Answer 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!
    }
}


Answer 2:

那么,在声明

ShortBuffer sb = bb.asShortBuffer();

据我所知,你的ShortBuffer只是原来的观点ByteBuffer 。 所以,你总是可以访问原始ByteBuffer变量bb和查看数据通过修改后CharBuffer引用sb

对于文档asCharBuffer说:

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



Answer 3:

我会记得字节缓冲区您之前在其创建ShortBuffer视图到同一个缓冲区。

否则,它似乎把它恢复的唯一方法是使用反射来获得bb场。

BTW:使用直接ByteBuffer可以显著加快,具体取决于你在做什么,尤其如果你使用本地字节顺序。



文章来源: convert a LongBuffer/IntBuffer/ShortBuffer to ByteBuffer