Un ti post pour tout ceux qui luttent avec la conversion hexa ==> Float, j'ai trouvé et fait un ti algo de conversion en C. Langage utilisé a seul but de tester mes algos, je sais qu'il y a beaucoup plus simple de faire en C
Il vous suffit donc de le comprendre et de le réimplementer dans votre langage préféré
Code: Select all
float binaryToFloat(long binary)
{
/* s represents the sign, e the exponent and m the mantissa */
char s = binary >> 31;
unsigned char e = ((binary & 0x7fffffff) >> 23) - 127;
long m = (binary & 0x007fffff) | (1 << 23);
/* deleting non significant bits */
while (!(m & 1))
m>>=1;
/* Finding the right coma position */
char comaPos = 31 - e;
long tmp = 0x80000000;
while (!(m & tmp))
{
tmp>>=1;
comaPos--;
}
/* conversion */
float f = 0.;
char i;
for(i = 0; i < 32; i++)
if(m & (1 << (i)))
f += pow(2., (i-comaPos));
s ? f*=-1 : true;
return f;
}
Je pense avoir suffisement détaillé l'algo et ne pas l'avoir fait comme un porc. Si tout fois vous avez du mal a en saisir les subtilité, je pourrais faire un ti explicatif

La fonction s'appelle avec un long qui contient la représentation binaire du flottant et retourne le flottant.
Edit : du code en bonus passage du code hexa lu en code binaire
Code: Select all
long hexToLong(char * hex)
{
long binary = 0;
char i;
/* Little endian conversion */
char dec[8] = {4, 0, 12, 8, 20, 16, 28, 24};
for(i = 0; i < 8; i++)
(*hex >= '0' && *hex <= '9') ? binary |= (long)(*hex++ - '0') << dec[i] : binary |= (long)(*hex++ - 'A' + 10) << dec[i];
return binary;
}
Il suffit donc pour avoir le float correspondant a la chaine lue de lancer par exemple :
Code: Select all
binaryToFloat(hexToLong("D47A7645"));