Connaitre l'endianess d'une machine
Il est relativement simple de coder une fonction permettant de savoir si une machine est Big ou Little Endian.
Cependant, j'aimerais savoir s'il existe un moyen plus rapide de le connaitre, comme par exemple un define dans un header, ou quelque chose du meme tonneau.
Une idee ?
Merci d'avance.
Jack.
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Jack_serious
Il est relativement simple de coder une fonction permettant de savoir si une machine est Big ou Little Endian.
Cependant, j'aimerais savoir s'il existe un moyen plus rapide de le connaitre, comme par exemple un define dans un header, ou quelque chose du meme tonneau.
Une idee ?
Merci d'avance.
Jack.
Si tu compiles avec les Autotools (automake, autoconf), tu peux déduire sur quelle machine tu es, via la macro WORDS_BIGENDIAN (qui sera ou non définie après le configure, et ce dans un header de configuration qui sera généré, et que tu devras inclure dans tes sources...)
Après, un simple
Code:
1 2 3 4 5 6
|
#ifdef WORDS_BIGENDIAN
#else
#endif |
Te permettra de savoir sur quel type d'architecture tu compiles...
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Pouic
Si tu compiles avec les Autotools (automake, autoconf), tu peux déduire sur quelle machine tu es, via la macro WORDS_BIGENDIAN (qui sera ou non définie après le configure, et ce dans un header de configuration qui sera généré, et que tu devras inclure dans tes sources...)
Dans un premier temps, merci beaucoup de ta reponse tardive.
Malheureusement pour moi, je n'utilise pas les Autotools, (pas encore du moins) et donc je ne pourrais pas mettre cette solution en pratique...
Il n'existe pas une macro similaire dans un header present sur la machine ?
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Jack_serious
Citation:
Envoyé par Pouic
Si tu compiles avec les Autotools (automake, autoconf), tu peux déduire sur quelle machine tu es, via la macro WORDS_BIGENDIAN (qui sera ou non définie après le configure, et ce dans un header de configuration qui sera généré, et que tu devras inclure dans tes sources...)
Dans un premier temps, merci beaucoup de ta reponse tardive.
;)
Citation:
Malheureusement pour moi, je n'utilise pas les Autotools, (pas encore du moins) et donc je ne pourrais pas mettre cette solution en pratique...
Il n'existe pas une macro similaire dans un header present sur la machine ?
En tout cas, pas à ma connaissance...
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Pouic
En tout cas, pas à ma connaissance...
C'est pas grave...
Merci en tout cas...
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Jack_serious
Cependant, j'aimerais savoir s'il existe un moyen plus rapide de le connaitre, comme par exemple un define dans un header, ou quelque chose du meme tonneau.
Il faut regarder les defines integrés des outils de développement. Il y en souvent un qui précise l'endianness.
Mais quel intérêt quand la plupart des implémentations du C fournissent htons(), htonl() etc.
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Emmanuel Delahaye
Mais quel intérêt quand la plupart des implémentations du C fournissent htons(), htonl() etc.
ntohl() et htonl() ? C'etait pas plutot pour pas avoir de probleme quand on recupere des donnes depuis un reseaux ? C'est fait de maniere transparente aussi...
Mais j'avais pas percute que ca pouvais resoudre mon probleme, alors si ca peut, c'est super :
J'ai un programme (une machine virtuelle en fait) qui traite ses donnees dans sa zone memoire selon une ecriture Big Endian. Mais cette machine va bien sur tourner sur plusieurs architectures, la portabilite, c'est sacre.
Tu crois que je peux regler ca avec htonl() et ntohl() ?
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Jack_serious
J'ai un programme (une machine virtuelle en fait) qui traite ses donnees dans sa zone memoire selon une ecriture Big Endian. Mais cette machine va bien sur tourner sur plusieurs architectures, la portabilite, c'est sacre.
Tu crois que je peux regler ca avec htonl() et ntohl() ?
Si Big Endian correspond à 'réseau', oui.
"réseau", c'est MSB en tête.
Par exemple 0x1234 est codé
12 34 en 16-bit (ntohs())
et
00 00 12 34 en 32-bit (ntohl())
quelque soit la représentation mémoire du host.
Au fait, rien de tout cela n'a à voir avec le langage C!
Re: Connaitre l'endianess d'une machine
Citation:
Envoyé par Emmanuel Delahaye
"réseau", c'est MSB en tête.
Aaah bah voila...
Ok la je comprend mieux. Donc oui ca va etre possible avec ntohl() et htonl().
Merci beaucoup ! (et bonne journee)
Jack.