Boost二进制Endian解析器无法正常工作?

时间:2010-05-19 22:51:52

标签: c++ binary endianness boost-spirit boost-spirit-qi

我正在研究如何使用boost spirit Qi二进制字符串解析器。我根据herebasics examples编写了一个小的测试解析器程序,但它不能正常工作。它给了我一个消息:“错误:不匹配”。

这是我的代码。

 
    #include "boost/spirit/include/qi.hpp"
    #include "boost/spirit/include/phoenix_core.hpp"
    #include "boost/spirit/include/phoenix_operator.hpp"
    #include "boost/spirit/include/qi_binary.hpp"  // parsing binary data in various endianness

template "<"typename P, typename T> void binary_parser( char const* input, P const& endian_word_type, T& voxel, bool full_match = true) { using boost::spirit::qi::parse; char const* f(input); char const* l(f + strlen(f)); bool result1 = parse(f,l,endian_word_type,voxel); bool result2 =((!full_match) || (f ==l)); if ( result1 && result2) { //doing nothing, parsing data is pass to voxel alreay } else { std::cerr << "Error: not match!!" << std::endl; exit(1); } } typedef boost::uint16_t bs_int16; typedef boost::uint32_t bs_int32; int main ( int argc, char *argv[] ){ namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; using qi::big_word; using qi::big_dword; boost::uint32_t ui; float uf; binary_parser("\x01\x02\x03\x04",big_word,ui); assert(ui=0x01020304); binary_parser("\x01\x02\x03\x04",big_word,uf); assert(uf=0x01020304); return 0; }

我几乎复制了这个例子,但为什么这个二进制解析器不起作用。我使用Mac OS 10.5.8和gcc 4.01编译器。

2 个答案:

答案 0 :(得分:2)

big_word解析器匹配大端字(16位),而big_dword将匹配您想要的(big-endian dword,32位)。但我不认为使用float作为二进制解析器的属性是个好主意,你可能得不到你期望的结果。

答案 1 :(得分:0)

我使用了错误的解析参数。我不应该使用big_word代替big_dword