Page 8 of 8

Re: Karto marche plus, cherche kkchose similaire

Posted: Thu Aug 24, 2006 4:55 pm
by benletib
WikiPedia est ton amie : http://fr.wikipedia.org/wiki/Ing%C3%A9nierie_inverse

Edit : Moi je ne suis pas convaincu par le fait qu'analyser les fichiers ICFG soit de l'Ingénierie Inverse au sens ou l'entend Nevrax...

Re: Karto marche plus, cherche kkchose similaire

Posted: Fri Aug 25, 2006 6:18 pm
by cyrille5
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é :p

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"));