Разбор текстового файла с двоичным конвертом с использованием 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
);
Но проблема в том, что каждая новая строка, пробел и т. Д. Опущены!
Теперь мои вопросы:
Как правильно извлечь содержимое между байтами 0x02/0x03 (ETX/STX), не пропуская пробелы, переводы строки и т. Д.
И подходит ли мне сначала удалить конверт, а затем проанализировать полезную нагрузку, или есть другой лучший подход, который я должен использовать?
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
Конечно, вы можете предпочесть сохранять контрольные суммы вне парсера.