Probleme de conversion d'endian sur un float

Fermé
surfeur29 Messages postés 75 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 18 novembre 2010 - 23 avril 2009 à 10:32
 loupius - 23 avril 2009 à 17:36
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..

1 réponse

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
surfeur29 Messages postés 75 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 18 novembre 2010 5
23 avril 2009 à 15:45
"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
loupius > surfeur29 Messages postés 75 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 18 novembre 2010
23 avril 2009 à 17:36
J'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