我有一个现有的协议(不可更改),我正在尝试用 netty 实现,其中数据包具有必须以大端和小端读取的字节以及以大端和小端写入的响应。
示例:00 00 00 04 02 00 05 00 00 00
此数据包值为 4、2 和 5。
我知道我可以以自己的方式实现这一点,但我想知道是否有“Netty”方式来做到这一点。
我找到了 .order(ByteOrder) 方法,但这似乎只是创建了一个新缓冲区,我不明白为什么我必须创建一个新对象来以不同的顺序读取字节。我在这里错过了什么吗?
我有一个现有的协议(不可更改),我正在尝试用 netty 实现,其中数据包具有必须以大端和小端读取的字节以及以大端和小端写入的响应。
示例:00 00 00 04 02 00 05 00 00 00
此数据包值为 4、2 和 5。
我知道我可以以自己的方式实现这一点,但我想知道是否有“Netty”方式来做到这一点。
我找到了 .order(ByteOrder) 方法,但这似乎只是创建了一个新缓冲区,我不明白为什么我必须创建一个新对象来以不同的顺序读取字节。我在这里错过了什么吗?
您可以简单地将缓冲区的字节顺序保留为 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();
我实际上很好奇 using.order(..)
是否明显比 using 慢,BufUtil.swap*()
尽管我的猜测是它们应该基本相同。