我目前正在尝试为 ASCII 文本文件编写一个解析器,该文件被一个带有校验和的小信封包围。
该文件的基本结构是:
我想将有效负载提取到另一个字符串中以将其提供给
下一个解析器。
我用来解析这个信封的解析器表达式是:
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 http://www.boost.org/doc/libs/1_57_0/libs/spirit/repository/doc/html/spirit_repository/qi_components/directives/confix.html).
但问题是每个换行符、空格等都被省略了!
嗯,那就是船长做什么 https://stackoverflow.com/questions/17072987/boost-spirit-skipper-issues/17073965#17073965。不要使用其中一个,或者:
Use qi::raw[]
要提取中间文本,我建议使用qi::raw
。尽管我不确定您是否真的想将其复制到字符串(复制听起来很昂贵)。当源是流(或输入迭代器的其他源)时,您可能可以执行此操作。
开创性规则:
myrule = '\x02' > raw [ *(char_ - '\x03') ] > '\x03';
您可以添加校验和:
myrule = '\x02' > raw [ *(char_ - '\x03') ] [ _a = _checksum(_1) ] > '\x03' >> qi::word(_a);
Assuming
qi::locals<uint16_t>
-
_checksum
是一个合适的 Phoenix 函子,它接受一对源迭代器并返回uint16_t
当然,您可能更愿意在解析器之外保留校验和。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)