将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的文档说:
[…]此缓冲区内容的更改将在新缓冲区中显示,反之亦然[…]