使用boost Spirit解析带有二进制信封的文本文件

时间:2015-03-19 12:39:32

标签: c++ parsing boost boost-spirit boost-spirit-qi

我目前正在尝试为包含校验和的小信封包围的ASCII文本文件编写解析器。

该文件的基本结构为:< 0x02><"文件有效负载">< 0x03>< 16bit CRC>

我希望在另一个字符串中提取有效负载以将其提供给 下一个解析器。

我用来解析这个信封的解析器表达式是:

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 个答案:

答案 0 :(得分: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的一部分)。

  

但问题是每个换行符,空白等都被省略了!

嗯,那是what a skipper does。不要使用一个,或者:

使用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是一个合适的Phoenix函数,它接受一对源迭代器并返回uint16_t

当然,您可能更喜欢在解析器之外保持校验和。