1

私はnettyで実装しようとしている既存のプロトコル(変更不可)を持っています。パケットにはビッグエンディアンとリトルエンディアンの両方で読み取る必要のあるバイトと、ビッグエンディアンとリトルエンディアンで書かれた応答があります。

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

このパケット値は4、2、および5です。

私はこれを自分のやり方で実装できることを知っていますが、これを行うための「Netty」の方法があるかどうか知りたいです。

.order(ByteOrder)メソッドを見つけましたが、これは新しいバッファーを作成するだけのようで、バイトを別の順序で読み取るために新しいオブジェクトを作成する必要がある理由がわかりません。私はここで何かが欠けていますか?

4

1 に答える 1

2

バッファのバイト順をビッグエンディアンのままにして、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(..)usingが using よりも著しく遅いかどうかは、実際には興味がありますBufUtil.swap*()が、私の推測では、それらは本質的にほぼ同じであるはずです。

于 2013-03-02T12:18:09.073 に答える