提升精神是否适合这种情况

Is boost spirit a good fit for this situation?

本文关键字:情况 是否      更新时间:2023-10-16

我遇到过一种情况,我试图从名称-值对流中构建HDF复合类型(为了简单起见,我们会说值可以是双精度或字符串)。需要明确的是,数字数据已经是二进制的 - 它不是一个字符串。名称提供结构信息(这是数组的一部分吗?,这是嵌套复合类型的一部分吗?)。

我正在想象制作一个标记向量,使用名称信息插入标记(例如"["和"]"分隔数组,"{"和"}"分隔嵌套化合物),但否则使用值。 从文档中我不清楚 Spirit 二进制解析器是否是处理数值的合适选择。

我无法判断"其余的"(即非二进制数据)是否证明使用 PEG 解析器生成器是合理的。

但是,只是为了给您一些开始的东西:

  • qi::bin_floatqi::little_bin_floatqi::big_bin_float
  • qi::bin_doubleqi::little_bin_doubleqi::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 如何处理二进制输入。

相关文章: