Boost Binary Endian парсер не работает? - PullRequest
0 голосов
/ 20 мая 2010

Я изучаю, как использовать бинарный спиртовый цианистический парсер. Я пишу небольшую тестовую программу парсера согласно здесь и базовым примерам , но она не работает должным образом. Он дал мне сообщение: «Ошибка: нет совпадения».

Вот мой код.

 
    #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</p>

   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 ]

2 голосов
/ 21 мая 2010

Парсер big_word соответствует слову с прямым порядком байтов (16 бит), тогда как big_dword будет соответствовать тому, что вы хотите (слово с прямым порядком байтов, 32 бита). Но я не думаю, что было бы хорошей идеей использовать float в качестве атрибута двоичного парсера, вы можете не получить то, что ожидаете.

0 голосов
/ 20 мая 2010

Я использовал неправильный синтаксический анализ. Я не должен использовать big_word вместо big_dword

...