эффективный и гибкий парсинг двоичных данных

У меня есть внешнее устройство, которое выводит UDP-пакеты с двоичными данными и программное обеспечение, работающее во встроенной системе, которое должно читать этот поток данных, анализировать его и делать что-нибудь полезное. Двоичные данные также записываются в файл. Я хотел бы написать синтаксический анализатор, который может легко принимать входные данные непосредственно из потока UDP или файла, анализировать данные в определенном формате, а затем направлять выходные данные либо в файл (например, файл данных Matlab), либо в другой процесс. это будет выполнять некоторую обработку в реальном времени. Есть ли какие-либо ресурсы, которые могут помочь мне в этом, и как лучше всего это сделать? Я думаю, что имеет смысл использовать потоки C ++, но я не знаком с созданием пользовательских потоков вывода. Кажется ли это хорошим подходом или есть способ лучше?

Спасибо.


person HazyBlueDot    schedule 31.08.2009    source источник


Ответы (2)


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

Прелесть в том, что это не требует разбора.

вы должны быть осторожны с правилами упаковки структуры и порядком байтов, чтобы карта структуры была точно такой же. Использование макросов «offsetof» и «sizeof» языка C полезно для выдачи некоторой отладочной информации, чтобы проверить, действительно ли ваша структура соответствует тому, что, по вашему мнению, она отображает.

Правила упаковки обычно можно изменить с помощью директив (например, # pragma's) или параметров командной строки. Endian-ness, с которым вы застряли. Если он отличается от того, что использует ваша встроенная система, объявите все поля как байты или используйте что-то вроде макроса «ntoh» для обмена байтами.

person Matthias Wandel    schedule 31.08.2009
comment
Спасибо за ответ. Я изучал использование магнитофона для выполнения части синтаксического анализа, и мне это нравится. Мне все еще остается фактический ввод / вывод ... Я хотел бы получить данные либо из пакетов UDP в реальном времени, либо из файла записанных данных, а затем записать проанализированные данные в другой файл или сделать он доступен какому-то другому классу или процессу. - person HazyBlueDot; 31.08.2009

New Jersey Machine Code Toolkit - это схема для декодирования произвольных двоичных образов. Изначально он был разработан для наборов инструкций декодирования, но должен подойти для декодирования форматов сообщений. Вы предоставляете описание двоичного формата, оно синтезирует код для доступа к полям этого формата (если он действителен). Таким образом, вы можете обращаться к полям сообщений, используя сгенерированные вызовы функций, а не думать о том, где находится поле или как оно закодировано.

person Ira Baxter    schedule 04.09.2009