Мне нужно связать мой код с каким-то двоичным протоколом, исходящим из приложения, которое я не могу контролировать. До сих пор я писал ручной разбор из данных, как:Хорошая библиотека для разбора двоичных протоколов с C++
char *data = ...
MovementPacket pkt;
pkt.x = data[0] | data[1] << 8;
pkt.y = data[2] | data[3] << 8;
Очевидно, что этот процесс очень подвержены ошибкам и утомительны. Я помню, как делал это в Java, как в:
pkt.x = stream.readShort();
pkt.y = stream.readShort();
Есть ли какая-то библиотека, которая позволяет мне делать это, принимая во внимание порядок байтов?
Я смотрел protobuf и cap'n'proto, но пока оба кажутся отличными, когда я могу определить обе стороны протокола, я не уверен, что они будут хорошо играть, если мне придется разбирать определенный протокол. Это правильно или я просто читал неправильные ресурсы? Существуют ли альтернативы, более подходящие для этой задачи?
Сам протокол представляет собой простой формат, ориентированный на TCP-сообщение: обработка из потока TCP в сообщения уже выполнена, мне нужно что-то разобрать сами сообщения. Все сообщения начинаются с двухбайтового поля идентификации, в котором указывается тип сообщения, за которым следуют данные сообщения. Пример, для пакета движения:
0x00 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02
[Msg. Id] [int32 X value] [int32 Y value]
Я искал какую-то библиотеку, которая может, учитывая структуру сообщения, разобрать его в структуры, принимая во внимание порядок байтов, без необходимости писать код вручную синтаксического анализа.
Вы имели в виду «хотите использовать сгенерированный протокол на одной стороне»? –
@jacek Я не совсем понял вопрос. Вы спрашиваете о том, что я сказал относительно протобуфа? –
Если это новый (так называемый «зеленый поле») протокол, не бойтесь использовать похожие библиотеки. Я использую Thrift в производстве. Очень хороший комфорт с типом безопасного кода. Возможно, FlatBuffers использует требования с низким уровнем распределения. Я думаю, что ни одна из таких библиотек не может помочь в анализе старого «ручного» протокола. –