2013-03-02 27 views
1

我有我试图用网状来实现,其中分组具有在两个要读取的字节现有协议(不变)大小写字母以及大小写的回应。的Netty 4:是否可以读取小端和大端字节在同一ByteBuf

举例:00 00 00 04 02 00 05 00 00 00

这个包的值是​​4,2和5

我知道我可以实现这个我自己的路,但我想知道如果有“Netty”的方式来做到这一点。

我找到了.order(ByteOrder)方法,但是这似乎只是创建一个新的缓冲区,我不明白为什么我应该创建一个新的对象以不同的顺序读取字节。我在这里错过了什么吗?

回答

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*()虽然我的猜测是,他们应该基本上大致相同慢。

+0

谢谢你的输入。我认为如果我可以将所有缓冲区创建为小端(提示?),第一种方法对我更好。它只是感到肮脏,不得不创建一个新的浅层对象或在读取完成后交换一个值。这感觉就像ByteBuf接口应该只是像readIntLE(方法),我记得看到一些约定在以前的单证有是这样做的界面,但它似乎消失了。 – Kyle 2013-03-02 16:02:17

相关问题