эффективный и гибкий анализ двоичных данных - PullRequest
2 голосов
/ 31 августа 2009

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 31 августа 2009

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

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

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

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

0 голосов
/ 04 сентября 2009

Инструментарий машинного кода Нью-Джерси - это схема для декодирования произвольных двоичных шаблонов. Первоначально он был разработан для декодирования наборов команд, но он должен быть хорошо подходит для декодирования форматов сообщений. Вы предоставляете описание двоичного формата, он синтезирует код для доступа к полям этого формата (если он действителен). Таким образом, вы можете ссылаться на поля сообщения, используя сгенерированные вызовы функций, а не думать о том, где находится поле или как оно закодировано.

...