将LongBuffer / IntBuffer / ShortBuffer转换为ByteBuffer

我知道一种快速的方法将byte / 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()这样的方法,而不是手动循环。

我已经向Sun发出2001年的请求 ,但是他们不接受它; – ((

那这个呢? :

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

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

否则它似乎唯一的方法是使用reflection来获取bb字段。

顺便说一句:如果使用本机字节顺序,使用直接ByteBuffer可以明显更快,具体取决于你在做什么esp。

好吧,在宣言中

 ShortBuffer sb = bb.asShortBuffer(); 

AFAIK,你的ShortBuffer只是原始ByteBuffer一个视图。 因此,您始终可以访问原始的ByteBuffer变量bb并通过CharBuffer参考sb查看修改后的数据。

asCharBuffer的文档说:

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