如何有效地从 ByteBuf 中获取一个短数组?

How to get a short array from ByteBuf efficiently?

使用java.nio.ByteBuffer时,我的代码是这样的:

ByteBuffer buffer = ...
ShortBuffer shortBuffer = buffer.asShortBuffer();
short[] shortArray = new short[shortBuffer .remaining()];
shortBuffer.get(shortArray);

现在使用 netty 4,如何有效地从 ByteBuf 中获取短数组? 或者我只是使用 ByteBuf.nioBuffer() 先得到一个 ByteBuffer

还有,如何高效地将短数组放入ByteBuf?我可以这样写代码吗:

Unpooled.buffer(...).nioBuffer().asShortBuffer().put(shortArray);

Netty 没有很好的机制来从 ByteBuf 中提取 Short[]。您可以使用复合解决方案来检测后端类型并使用不同的方式来处理该后端,回退到底层数组的简单复制。

NioBuffer 的情况很简单,它有一个简单的 get() 操作来读取生成的短数组。

直接和基于数组的情况更难,这些情况需要我们在循环中调用 readShort() 直到我们填充结果数组。

生成的代码如下所示:

ByteBuf buf = ...;
short[] result;
if(buf.readableBytes() % 2 != 0) {
    throw new IllegalArgumentException();
}
result = new short[buf.readableBytes() / 2];
if (buf.nioBufferCount() > 0 ){
    buf.nioBuffer().asShortBuffer().get(result);
} else {
    for(int i = 0; i < result.length; i++) {
        result[i] = buf.readShort();
    }
}