Probleme de conversion d'endian sur un float

Bonjour,

Dans le projet en cpp que je suis en train d'effectuer, il faut lire un fichier binaire mais je n'arrive pas à lire correctement les float à cause du problème de big/little endian. Malgré des tests de codes trouvés sur le net, cela ne fonctionne pas correctement..

voici le code qui me semblait le mieux...

float Parse::convert_long(float in, bool endian)
{
float out;

if(endian==true)
{
char *p_in = (char *) ∈
char *p_out = (char *) &out;
p_out[0] = p_in[3];
p_out[1] = p_in[2];
p_out[2] = p_in[1];
p_out[3] = p_in[0];
}
else if(endian==false)
{
out = in;
}

return out;
}

Le problème c'est que je récupère des nombres extravagants du genre -3.21567e-38 alors que je devrais obtenir des nombres du genre 38546.9954 ...

Merci de votre aide parce que je commence à devenir fou avec ce problème qui me bloque dans la suite de mon projet..
Configuration: Linux
Firefox 3.0.7

1 réponse

  1. A part le if(endian==false) qui est totalement inutile, le reste me parait correct.
    Est-tu certain que sur ta machine, le float est bien un 32 bits ? Faire un 'print sizeof(float)'.
    Tu peux utiliser des trucs du genre:
    for (int i=0; i< sizeof(float); i++)
      printf ("%02X ", (unsigned char)((char*)&nombre)[i]);
    avant et après conversion pour suivre la valeur.
    0
    1. "if(endian==false)" me sert a connaitre l'endianness en fonction du type du processeur.

      Je vais tester ton code et je te tiens au courant.

      merci
      0
    2. @surfeur29J'ai l'impression que tu n'as pas pigé le
      if (condition)
         branche1
      else
         branche2
      Si la condition est vraie, alors branche1 est exécutée sinon branche2 est exécutée. Il ne sert à rien de mettre:
      if (condition vraie)
         branche1
      else if (condition fausse)
         branche2
      C'est juste mais ça ne sert à rien.
      Dans le code que j'ai donné, il ne faut pas écrire print sizeof(float), c'est un raccourci pour: printf ("taille du float: %d\n", sizeof(float));
      0