将LongBuffer / IntBuffer / ShortBuffer转换为ByteBuffer

时间:2012-07-26 08:19:17

标签: java arrays bytearray nio

我知道将字节/ short / int / long数组转换为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()这样的方法,而不是手动循环来实现它。

我找到了request to Sun of 2001,但他们不接受; - (

3 个答案:

答案 0 :(得分:28)

这个怎么样? :

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

答案 1 :(得分:1)

我会记得你用来创建ShortBuffer的ByteBuffer,因为它是一个视图到同一个缓冲区。

否则看起来唯一的方法就是使用反射来获取bb字段。

BTW:如果使用本机字节顺序,使用直接ByteBuffer可能会明显加快,具体取决于你在做什么esp。

答案 2 :(得分:1)

嗯,在宣言中

ShortBuffer sb = bb.asShortBuffer();

AFAIK,您的ShortBuffer只是原始ByteBuffer的视图。因此,您始终可以访问原始的ByteBuffer变量bb,并通过CharBuffer引用sb查看已修改的数据。

asCharBuffer的文档说:

  

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