2013-03-02 1024 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

相關問題