17

我知道一种将 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() 之类的方法,而不是手动循环。

我找到了2001 年向 Sun 提出的请求,但他们没有接受;-((

4

3 回答 3

31

那这个呢?:

    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!
    }
}
于 2012-07-26T08:56:17.447 回答
3

好吧,在声明中

ShortBuffer sb = bb.asShortBuffer();

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

asCharBuffer的文档说:

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

于 2012-07-26T08:26:33.730 回答
0

我会记得您用来创建 ShortBuffer 的 ByteBuffer 作为它在同一个缓冲区上的视图。

否则,似乎要恢复它的唯一方法是使用反射来获取该bb字段。

顺便说一句:如果您使用本机字节顺序,则使用直接 ByteBuffer 可能会明显更快,具体取决于您正在做什么,尤其是。

于 2012-07-26T08:26:06.977 回答