Назовите меня Двоичным Синтаксическим анализатором. Синтаксический анализатор для [закрытых] двоичных данных

Так, я получаю эти данные. От сетевого сокета, или из файла. Я чиню код, который интерпретирует данные. Считайте некоторые байты, проверьте некоторые флаги, и некоторые байты указывают, сколько данных следует. Читайте в так большом количестве данных, промывке, повторитесь.

Эта задача напоминает мне очень парсингу исходного кода. Я удобен с lex/yacc и antlr, но они не до этой задачи. Вы не можете определить биты и необработанные байты как маркеры (хорошо, возможно, Вы могли, но я не буду знать, как), и Вы не можете подключить их коаксиальным кабелем в "чтение два байта, превратить их в неподписанное целое число на 16 битов, назовите его n и затем считайте n байты"..

С другой стороны, когда спецификация протокола/формата данных определяется систематическим способом (не, все они), должен быть систематический способ читать в данных, которые отформатированы согласно протоколу. Право?

Существует, должен быть инструмент, который делает это.

21
задан doppelfish 6 February 2010 в 21:43
поделиться

3 ответа

Вы можете попробовать использовать Boost.Spirit (v2), который недавно получил инструменты двоичного анализа , порядок байтов -aware родные и смешанные парсеры

// This is not a complete and useful example, but just illustration that parsing
// of raw binary to real data components is possible
typedef boost::uint8_t byte_t;
byte_t raw[16] = { 0 };
char const* hex = "01010000005839B4C876BEF33F83C0CA";
my_custom_hex_to_bytes(hex, raw, 16);

// parse raw binary stream bytes to 4 separate words
boost::uint32_t word(0);
byte_t* beg = raw;
boost::spirit::qi::parse(beg, beg + 16, boost::spirit::qi::dword, word))

ОБНОВЛЕНИЕ: Я нашел аналогичный вопрос, где Джоэл де Гусман подтверждает в своем ответе наличие двоичных парсеров: Можно ли использовать Boost Spirit для анализировать данные байтового потока?

8
ответ дан 29 November 2019 в 21:49
поделиться

Считайте на ASN.1. Если Вы можете описать двоичные данные в их терминах, то Вы можете использовать различные доступные комплекты. Не для слабонервных.

1
ответ дан 29 November 2019 в 21:49
поделиться

Разумеется, ничто не мешает вам написать рекурсивный приличный анализатор, скажем, для двоичных данных так же, как вы бы вручную создавали анализатор текста. Если формат, который вам нужно прочитать, не слишком сложен, это разумный способ продолжить.

Конечно, если вы форматируете очень просто, вы можете взглянуть на Чтение двоичного файла, определенного структурой , и аналогичный вопрос.

Я не знаю никаких генераторов парсеров для нетекстового ввода, хотя они тоже возможны.


Если вы не знакомы с кодированием парсеров вручную, канонический вопрос SO: Научиться писать компилятор . Учебник Crenshaw в PDF ) можно быстро прочитать.

0
ответ дан 29 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: