1

在 Netty 3 中,我们在每一端使用 LITTLE_ENDIAN ChannelBuffers

bootstrap.setOption("child.bufferFactory", new HeapChannelBufferFactory(ByteOrder.LITTLE_ENDIAN));

但在 Netty 4 中,ByteBuf 的配置现在似乎是通过 ChannelOption.ALLOCATOR:

    bootstrap.option(ChannelOption.ALLOCATOR, someAllocator);

我们真正想做的就是装饰UnpooledByteBufAllocator,但它是final的,我们需要装饰的方法是受保护的,所以我们不能扩展类或委托给它。我们不得不求助于代理方法:

private static class AllocatorProxyHandler implements InvocationHandler {
    private final ByteBufAllocator allocator;

    public AllocatorProxyHandler(ByteBufAllocator allocator) {
        this.allocator = allocator;
    }

    public static ByteBufAllocator proxy(ByteBufAllocator allocator) {
        return (ByteBufAllocator) Proxy.newProxyInstance(AllocatorProxyHandler.class.getClassLoader(), new Class[]{ByteBufAllocator.class}, new AllocatorProxyHandler(allocator));
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(allocator, args);
        if (result instanceof ByteBuf) {
            return ((ByteBuf) result).order(ByteOrder.LITTLE_ENDIAN);
        } else {
            return result;
        }
    }
}

像这样设置引导选项:

    bootstrap.option(ChannelOption.ALLOCATOR, AllocatorProxyHandler.proxy(UnpooledByteBufAllocator.DEFAULT));

我们还缺少其他(更好的)方法吗?

4

1 回答 1

2

默认情况下, Netty 4.0ByteBuf是大端的。ByteBuf您可以使用以下方法获得 little-endian 视图order(ByteOrder)

ByteBuf buf = ctx.alloc().buffer();
ByteBuf leBuf = buf.order(ByteOrder.LITTLE_ENDIAN);
leBuf.getByte(...);
...

这是为了避免将字节顺序作为状态变量而引起的任何混淆。如果有充分的理由必须提供一种更改默认字节顺序的方法,请告诉我们,以便我们重新考虑这个决定。

于 2013-11-14T08:06:36.703 回答