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

Marc Mongenet marc at mongenet.ch
Fri Mar 2 22:36:00 CET 2012


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;
}


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


More information about the gull mailing list