Probleme de conversion d'endian sur un float

surfeur29 Messages postés 76 Statut Membre -  
 loupius -
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

loupius
 
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 76 Statut Membre 5
 
"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 76 Statut Membre
 
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