2013-03-02 2 views
1

У меня есть существующий протокол (неизменный), который я пытаюсь реализовать с помощью netty, где у пакетов есть байты, которые должны быть прочитаны в обоих большой и маленький endian, а также ответы, написанные большими и маленькими endian.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()); 

С другой стороны, в Нетти 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

Благодарим вас за ввод. Я думаю, что первый метод будет работать лучше для меня, если я могу создать все буферы как маленькие endian (подсказки?). Просто становится грязным, чтобы создать новый мелкий объект или поменять значение после того, как оно будет прочитано, чтобы выполнить это. Похоже, что интерфейс ByteBuf должен иметь только такие методы, как readIntLE(), и я вспоминаю, что некоторые соглашения в предыдущих документах содержали интерфейс, который сделал это, но, похоже, он исчез. – Kyle

Смежные вопросы