我有一种情况,我试图从名称 - 值对的流中构建HDF复合类型(为简单起见,我们会说一个值可以是double或者一个字符串)。为了清楚起见,数字数据已经是二进制的 - 它不是一个字符串。这些名称提供了结构信息(这是数组的一部分吗?,这是嵌套复合类型的一部分吗?)。
我正在想象制作一个标记向量,使用名称信息来插入标记(例如'['和']'来分隔数组,'{'和'}'来分隔嵌套的化合物),但是否则使用价值。如果Spirit二元解析器是处理数值的合适选择,那么我从文档中就不清楚了。
答案 0 :(得分:1)
我无法判断“其余”(即非二进制数据)是否适合使用PEG解析器生成器。
但是,只是为了给你一些开始:
使用
qi::bin_float
,qi::little_bin_float
或qi::big_bin_float
qi::bin_double
,qi::little_bin_double
或qi::big_bin_double
这是一个17行的示例程序,它完全复制了
的行为od -w8 -A none -t f8 -v input.dat
我的盒子上的:
#include <boost/spirit/include/qi.hpp>
#include <fstream>
#include <iomanip>
namespace qi = boost::spirit::qi;
int main() {
using namespace std;
// read file
ifstream ifs("input.dat", ios::binary);
string const input { istreambuf_iterator<char>(ifs), {} };
// parse
vector<double> result;
bool ret = qi::parse(begin(input), end(input), *qi::bin_double, result);
// print
if (ret) for (auto v : result)
cout << setw(28) << setprecision(16) << right << v << "\n";
}
使用的命令:
clang++ -Os -std=c++11 -Wall -pedantic main.cpp # compile
dd if=/dev/urandom count=32 bs=1 2>/dev/null > input.dat # generate input
./a.out # spirit demo
echo 'And `od` output:'
od -w8 -A none -t f8 -v /tmp/input.dat # compare to `od`
免责声明这只是为了帮助您了解Spirit如何处理二进制输入。