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

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

我目前正在尝试为一个 ASCII 文本文件编写一个解析器,该文件被一个带有校验和的小信封包围。

文件的基本结构是:<0x02><"File payload"><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. 我的方法是先移除信封然后解析 有效载荷好还是我应该使用另一种更好的方法?

最佳答案

使用例如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 )。

But problem is that every newline, blank etc. is omitted!

嗯,那是 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

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

关于c++ - 使用boost Spirit解析带有二进制信封的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29144837/

相关文章:

c++ - 如何查找字符串中包含数字的单词

c++ - 将 QQmlListProperty 作为参数从 QML 传递到 C++

python - parser.add_argument 支持多种类型

c++ - 在 Debug模式下访问冲突,但在 Release模式下正常

c++ - 有没有一种方法可以在不污染命名空间的情况下使用 boost::assign 运算符?

c++ - 使用 cornerHarris 知道角的数量

c++ - 从 C++ 中的二进制文件读取不同字节顺序的整数

c++ - 右递归文法还是左递归文法?

c++ - 如何解析 C++ 以创建 AST?

c++ - 具有相同简单改编结构属性的 boost::spirit::qi 规则会产生编译错误