[gull] déserialiser une valeur double (ieee 754) avec be64toh

Philippe Strauss philippe at strauss-acoustics.ch
Sat Mar 3 11:54:55 CET 2012


Hé super intéressant, je ne connaissais pas !

Le 2 mars 2012 à 22:36, Marc Mongenet a écrit :

> Le 2 mars 2012 22:04, Philippe Strauss <philippe at strauss-acoustics.ch> a écrit :
>> les macros be64toh et compagnie acceptent un uint64_t en entrée, donc il
>> y a le cast automatique floats <-> ints qui entre en action pas pour le
>> meilleur dans ce cas.
> 
> Tu veux dire msgp->payload.vol.volume est de type double ?
> Dans ce cas, l'appel à be64toh serait bien trop tardif
> et ça ne peux clairement pas marcher.
> 
>> marrant, ocaml n'a pas de type champs de bits natif propre au langage,
>> mais C non plus, C ne fait pas mieux dans ce cas.
> 
> Oh si, C supporte les champs de bits (bit-field).
> Ce n'est guère utilisé, mais tout à fait standard.
> 
> #include <stdio.h>
> 
> struct s {
> 	unsigned bf0:8;
> 	unsigned bf1:16;
> 	unsigned bf2:4;
> 	unsigned bf3:4;
> };
> 
> union u {
> 	struct s s;
> 	unsigned char uc[4];
> };
> 
> int main(void) {
> 	union u u;
> 	
> 	u.s.bf0 = 1;
> 	u.s.bf1 = 2;
> 	u.s.bf2 = 4;
> 	u.s.bf3 = 8;
> 
> 	printf("%x %x %x %x\n", u.uc[0], u.uc[1], u.uc[2], u.uc[3]);
> 	return 0;
> }

par contre t'as tjr besoin d'une union avec un type standard dans le cas de fait du printf dessus ?


> 22:34:33 marc at kameha /tmp
> gcc -Wall c.c
> 22:35:24 marc at kameha /tmp
> ./a.out
> 1 2 0 84
> 22:35:25 marc at kameha /tmp
> 
> 
> Marc
> _______________________________________________
> gull mailing list
> gull at forum.linux-gull.ch
> http://forum.linux-gull.ch/mailman/listinfo/gull

--
Philippe Strauss
http://www.strauss-acoustics.ch/







More information about the gull mailing list