2016-12-06 6 views
0

Мне нужно связать мой код с каким-то двоичным протоколом, исходящим из приложения, которое я не могу контролировать. До сих пор я писал ручной разбор из данных, как:Хорошая библиотека для разбора двоичных протоколов с 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] 

Я искал какую-то библиотеку, которая может, учитывая структуру сообщения, разобрать его в структуры, принимая во внимание порядок байтов, без необходимости писать код вручную синтаксического анализа.

+0

Вы имели в виду «хотите использовать сгенерированный протокол на одной стороне»? –

+0

@jacek Я не совсем понял вопрос. Вы спрашиваете о том, что я сказал относительно протобуфа? –

+0

Если это новый (так называемый «зеленый поле») протокол, не бойтесь использовать похожие библиотеки. Я использую Thrift в производстве. Очень хороший комфорт с типом безопасного кода. Возможно, FlatBuffers использует требования с низким уровнем распределения. Я думаю, что ни одна из таких библиотек не может помочь в анализе старого «ручного» протокола. –

ответ

2

Будьте предупреждены, что это серьезно относится к «расширенным темам», но Boost.Spirit имеет поддержку endian-specific binary parsing via Qi. Там может быть что-то, что поможет вам выполнить все или часть вашей задачи, если вы достаточно предприимчивы, чтобы копаться в источнике.

Описание протокола несколько полезно. Если примитивными типами являются все int32, эта проблема довольно сговорчива. Тем не менее, мне кажется маловероятным, что вы захотите найти этот Святой Грааль нулевого кода синтаксического анализа, поскольку это обычное, если угодно, протокол. Возможно, вы можете свести проблему к одному из парсинга только определенных типов - тогда простой парсер, вызывающий ряд функций parse(primitiveTypeValue) для добавления к std::vector<primitiveType> для каждого примитива, может быть выполнимым.

+0

Да, я прочитал http://stackoverflow.com/q/285200/1119282 о Boost.Spirit, но я действительно искал что-то более простое. –

+0

Понял. Возможно, более подробная информация о протоколе, который вы должны проанализировать, будет лучше отвечать. –

+0

добавлено редактирование с примером сообщения. Это не очень сложный протокол, есть много разных сообщений, состоящих из примитивных типов. Это то, что вы спросили? –