Разбор текстового файла с двоичным конвертом с использованием Boost Spririt

В настоящее время я пытаюсь написать анализатор для текстового файла ASCII, который окружен небольшим конвертом с контрольной суммой.

Основная структура файла: <0x02><"Полезная нагрузка файла"><0x03>

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

Выражение парсера, которое я использую для разбора этого конверта:

qi::phrase_parse(
    first, last,
    char_('\x02') >> *print >> char_('\x02') >> *xdigit,
    space
);

Ввод потребляется... и я уже пытался выгрузить полезную нагрузку:

qi::phrase_parse(
    first, last,
    char_('\x02') >> *print[cout << _1] >> char_('\x02') >> *xdigit,
    space
);

Но проблема в том, что каждая новая строка, пробел и т. Д. Опущены!

Теперь мои вопросы:

  1. Как правильно извлечь содержимое между байтами 0x02/0x03 (ETX/STX), не пропуская пробелы, переводы строки и т. Д.

  2. И подходит ли мне сначала удалить конверт, а затем проанализировать полезную нагрузку, или есть другой лучший подход, который я должен использовать?

1 ответ

Решение

Например, используйте qi::seek/qi::confix (обе части репозитория http://www.boost.org/doc/libs/1_57_0/libs/spirit/repository/doc/html/spirit_repository/qi_components/directives/confix.html).

Но проблема в том, что каждая новая строка, пробел и т. Д. Опущены!

Ну, это то, что делает шкипер. Не используйте один или:

использование qi::raw[]

Чтобы извлечь промежуточный текст, я предлагаю использовать qi::raw, Хотя я не уверен, что вы на самом деле хотите скопировать его в строку (копирование звучит дорого). Вы можете сделать это, вероятно, когда источником является поток (или другой источник входных итераторов).

Основное правило:

myrule = '\x02' > raw [ *(char_ - '\x03') ] > '\x03';

Вы можете добавить контрольную сумму:

myrule = '\x02' > raw [ *(char_ - '\x03') ] [ _a = _checksum(_1) ] > '\x03' >> qi::word(_a);

Если предположить,

  • qi::locals<uint16_t>
  • _checksum является подходящим функтором Феникса, который принимает пару исходных итераторов и возвращает uint16_t

Конечно, вы можете предпочесть сохранять контрольные суммы вне парсера.

Другие вопросы по тегам