2010-05-19 3 views
0

Я изучаю, как использовать бинарный синтаксический анализатор синтаксиса Qi. Я пишу небольшую тестовую парсерную программу в соответствии с here и basics examples, но она не работает должным образом. Это дало мне сообщение: «Ошибка: нет совпадения».Boost Binary Endian parser не работает?

Вот мой код.


    #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

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

+0

Благодарим вас, вы правы. Я не понял, чего я ожидаю. Так должен ли я проанализировать его как unsigned 32bit int сначала, а затем static_cast это как float? Или есть лучший способ закончить эту работу? Нужно ли мне напрямую менять байты для float или double? –

+0

Как правило (хорошо, в IEEE-754), float и double не чувствительны к концу, их компоновка одинакова на всех архитектурах. Если вам нужно ввести/вывести двоичное (бит) представление поплавков и удваивает использование Spirit, вам, вероятно, нужно сделать что-то некрасивое, как: float f; * reinterpret_cast (&f);) или некоторые неприятные трюки с объединением. Но теперь, когда я думаю об этом, я считаю, что лучшим решением было бы добавить bin_float и bin_double парсеры/генераторы в Spirit. В настоящее время они отсутствуют. Я могу просто написать статью на сайте Spirit об этом ... – hkaiser

+0

Вы правы. Мне не нужен Дух для обработки чисел с плавающей точкой. Я нашел здесь свой ответ. http://stackoverflow.com/questions/1695681/reading-from-and- Писательское-к-среднего уровня, а-двоично-файл-в-см –

0

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