【问题标题】:Is boost spirit a good fit for this situation?升压精神适合这种情况吗?
【发布时间】:2013-11-16 10:56:05
【问题描述】:

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

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

【问题讨论】:

  • 根据我有限的经验(2 周的研究),如果您没有这方面的经验,其他一切都是更好的选择。以 boost 精神开始编写非常困难,生成的代码编译速度极慢。最后代码的优雅不值得一游。否则,如果您仔细询问如何询问,您可能希望在本网站上获得帮助。有几个经验丰富的人会回答你遇到的每一个问题(不过要准备好被光顾)
  • 在我看来,大部分工作将是整理出您的确切编码协议和数据结构......解析可以很容易地使用 std::stream 和 read() , 一些 if 和 while 语句....
  • @TonyD 你和每个人都犯了同样的错误:“文本”在计算中的任何地方都不是微不足道的。想想Unicode。想想 INF,负 INF,NaN,想想指数,想想(任意)精度,(in)显着空白......最好在开始之前明确要求。致 OP:Spirit 在这里很有用,但你必须学习一些东西,正如 gsf 警告的那样
  • @sehe 我在编写临时解析器的道路上走得很远,并后退一步探索替代方案。 Spirit 看起来很有趣,但我的令牌流有点不合时宜——数字数据已经被转换了。如果我最终使用更难看的临时填充代码来与 Spirit 交互,我会觉得很傻。所以我在这里问一下,做一个小小的健全性检查。
  • @user888379 好的,我不会尝试 Oracle 什么是合适的(我不相信你会想在这里使用 Spirit)。无论如何,我发布了一个答案,显示 Spirit 如何处理输入中的原始二进制浮点数。

标签: c++ boost-spirit hdf5


【解决方案1】:

我无法判断“其余部分”(即非二进制数据)是否证明使用 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";
}

Live on Coliru


使用的命令:

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 如何处理二进制输入。

【讨论】:

  • 谢谢!这很有帮助,感谢您的周到。
猜你喜欢
  • 2012-01-21
  • 1970-01-01
  • 2012-07-04
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2023-03-10
相关资源
最近更新 更多