其他分享
首页 > 其他分享> > c-使用boost Spririt解析带有二进制信封的文本文件

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

作者:互联网

我目前正在尝试为一个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
);

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

现在我的问题是:

>如何提取0x02 / 0x03(ETX / STX)字节之间的内容
正确地省略空格,换行符等.
>这是我首先移除信封然后解析
有效负载好还是应该使用另一种更好的方法?

解决方法:

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

当然,您可能更希望将校验和保持在解析器之外.

标签:boost-spirit-qi,c,parsing,boost,boost-spirit
来源: https://codeday.me/bug/20191013/1905941.html