2010-05-19 16 views
0

J'étudie comment utiliser l'esprit de boost Qi binaire endian parser. J'écris un petit programme de parseur de test selon here et basics examples, mais cela ne fonctionne pas correctement. Il m'a donné le msg: "Erreur: pas de correspondance".Boost Binary Endian parser ne fonctionne pas?

Voici mon code.


    #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; }

Je copie presque l'exemple, mais pourquoi cet analyseur binaire ne fonctionne pas. J'utilise Mac OS 10.5.8 et le compilateur gcc 4.01.

Répondre

2

L'analyseur big_word correspond à un mot big-endian (16 bits), tandis que big_dword va correspondre à ce que vous voulez (dword big-endian, 32 bits). Mais je ne pense pas que ce soit une bonne idée d'utiliser un flottant comme attribut de l'analyseur binaire, vous pourriez ne pas obtenir ce que vous attendez.

+0

Merci, vous avez raison. Je n'ai pas compris ce que j'attendais. Alors devrais-je l'analyser en tant que int 32bit non signé d'abord, puis static_cast en tant que float? Ou y a-t-il une meilleure façon de terminer ce travail? Ai-je besoin d'échanger directement les octets pour float ou double? –

+0

Généralement (bien, dans IEEE-754), float et double ne sont pas sensibles à l'endian, leur mise en page est la même sur toutes les architectures. Si vous avez besoin d'entrer/sortir la représentation binaire (bit) des flottants et des doubles en utilisant Spirit, vous devrez probablement faire quelque chose de moche comme: float f; * reinterpret_cast (&f); ou quelques astuces avec un syndicat.) Mais maintenant que j'y pense, je crois que la meilleure solution serait d'ajouter bin_float et bin_double parseurs/générateurs à l'esprit, ceux qui manquent actuellement. sur le site Spirit à ce sujet ... – hkaiser

+0

Vous avez raison, je n'ai pas besoin de Spirit pour gérer les nombres flottants, j'ai trouvé ma réponse ici http://stackoverflow.com/questions/1695681/reading-from-and- ecrire-au-milieu-d'un binaire-fichier-en-cc –

0

J'ai utilisé un mauvais paramètre d'analyse. Je ne devrais pas utiliser big_word au lieu de big_dword