使用 boost::spirit 解析二进制文件时更改属性类型
Change attribute type when parsing binary with boost::spirit
我已经成功地使用 boost::spirit::qi
来解析由内置解析器组成的流(例如 byte_
、little_word
等(。但是,我现在需要解析不属于这些类别之一的数据。例如,我想将 16.16 的定点二进制数转换为双精度数;例如,little_word << little_16p16
会解析一个uint16_t
后跟一个double
(从定点数解析(。
我首先考虑了语义操作,但是(我认为...(它们不合适,因为它们不会更改与解析器关联的属性的类型。我也无法弄清楚如何使员工结构解析示例适应这种情况,因为它依赖于 boost::fusion
提供的隐式强制转换。这种方法在这里行不通,因为我显然无法在不引起重大问题的情况下定义从uint32_t
到double
的隐式强制转换。
我的倾向是我需要添加非终端来包装内置的二进制原语解析器或从头开始编写终端解析器。即使看了qi_binary.hpp
的来源,我也不知道该怎么做。任何人都可以提供一些示例代码和/或指导我进入相关参考资料以开始使用吗?
template < typename Iterator >
struct parser : boost::spirit::qi::grammar < Iterator, double(), boost::spirit::ascii::space_type >
{
struct cast_impl
{
template < typename A >
struct result { typedef double type; };
double operator()(boost::fusion::vector < boost::uint16_t, boost::uint16_t > arg) const
{
// cast here
return 0;
}
};
parser() : parser::base_type(main)
{
pair = boost::spirit::qi::little_word >> '.' >> boost::spirit::qi::little_word;
main = pair[boost::spirit::qi::_val = cast(boost::spirit::qi::_1)];
}
boost::spirit::qi::rule < Iterator, boost::fusion::vector < boost::uint16_t, boost::uint16_t > (), boost::spirit::ascii::space_type > pair;
boost::spirit::qi::rule < Iterator, double(), boost::spirit::ascii::space_type > main;
boost::phoenix::function<cast_impl> cast;
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::string container;
container data_ = "x01x02.x01x02";
container::iterator iterator_ = data_.begin();
double value_;
bool result_ =
boost::spirit::qi::phrase_parse(iterator_, data_.end(),
parser < container::iterator > (),
boost::spirit::ascii::space,
value_);
return 0;
}
相关文章:
- 用概念检查属性的类型
- 变量(或属性)可以等于类型吗?
- C++类型的属性是继承的吗
- 如何在一个属性中动态存储基元类型
- C++将两个不同类型的向量的属性连接到新的向量中
- 将提升属性映射与捆绑类型一起使用
- 使用类属性调用具有非类型模板参数的模板函数
- 如何在提升图形库中获取属性的类型
- 我创建了deque<CObject*>并添加了不同类型的元素。如何更改此元素的属性?
- 应用于类型别名声明的 [[maybe_unused]] 属性的语法
- 精神X3,如何获得属性类型以匹配规则类型
- 如何在 C++ 中使类属性类型与在 C# 中一样
- 如何使用Qi :: Hold []解析器指令.(带有boost ::交换的属性类型的问题)
- 将单个属性类转换为属性类型
- 枚举类型作为QML的C++类中的属性类型
- 强制属性类型为doxygen
- QML 无法将分配shared_ptr分配给<Track> [未知属性类型]
- 使用 boost::spirit 解析二进制文件时更改属性类型
- 属性类型未知的模板类中的默认构造函数
- Boost spirit解析器属性类型不工作