我有一个现有的协议(不可更改),我试图用netty实现,其中数据包具有必须以大端和小端读取的字节以及以大端和小端编写的响应。
示例:00 00 00 04 02 00 05 00 00 00
此数据包值为4,2和5.
我知道我可以按照自己的方式实现这一点,但我想知道是否有“Netty”方法可以做到这一点。
我找到了.order(ByteOrder)方法,但这似乎只是创建一个新的缓冲区,我不明白为什么我必须创建一个新对象以不同的顺序读取字节。我在这里错过了什么吗?
答案 0 :(得分:2)
您可以简单地将缓冲区的字节顺序保留为big-endian并使用BufUtil.swap*()
。在你的情况下:
int a = buf.readInt();
int b = BufUtil.swapShort(buf.readShort());
int c = BufUtil.swapInt(buf.readInt());
另一方面,在Netty 4中,由.order(ByteOrder)
创建的缓冲区由原始缓冲区缓存,因此.order(ByteOrder)
的开销应该非常小,只要连接是短暂的。如果您使用.order(ByteOrder)
:
int a = buf.readInt();
int b = buf.order(LITTLE_ENDIAN).readShort();
int c = buf.order(LITTLE_ENDIAN).readInt();
如果使用.order(..)
明显比使用BufUtil.swap*()
慢,我真的很好奇,虽然我的猜测是它们应该基本相同。