使用boost Spirit解析带有二进制信封的文本文件
Parsing text file with binary envelope using boost Spririt
我目前正在尝试为一个 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
);
但问题是每个换行符、空格等都被省略了!
现在我的问题:
如何提取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 仿函数,它带有一对源迭代器和 returns uint16_t
当然,您可能更愿意在解析器之外保持校验和。
我目前正在尝试为一个 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
);
但问题是每个换行符、空格等都被省略了!
现在我的问题:
如何提取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 仿函数,它带有一对源迭代器和 returnsuint16_t
当然,您可能更愿意在解析器之外保持校验和。