Determiner architecture Intel
Le
Alain BARTHE
Bonjour,
Je dois determiner dans un code si je suis en architecture little ou big
endian, pour swapper ou non les octets de certains champs.
Le meme code doit tourner sous Linux sur architecture Intel 32 ou 64
bits, et sous Solaris sur Sparc
J'avais precedemment utilise :
#ifdef __i386
#define HAVE_TO_SWAP_BYTES
#endif
Je suis maintenant passe sur un PC 64 bits et la constante __i386 ne
semble plus definie.
1) Quelle constante utiliser pour quelle marche dans tous les cas,
pour detecter une architecture INTEL (32 ou 64 bits)
2) Y a t-il un moyen plus propre pour savoir si on se trouve en
little ou big endian ?
Je predererais utiliser des #ifdef que faire un test de l'ordre des bits
Je dois determiner dans un code si je suis en architecture little ou big
endian, pour swapper ou non les octets de certains champs.
Le meme code doit tourner sous Linux sur architecture Intel 32 ou 64
bits, et sous Solaris sur Sparc
J'avais precedemment utilise :
#ifdef __i386
#define HAVE_TO_SWAP_BYTES
#endif
Je suis maintenant passe sur un PC 64 bits et la constante __i386 ne
semble plus definie.
1) Quelle constante utiliser pour quelle marche dans tous les cas,
pour detecter une architecture INTEL (32 ou 64 bits)
2) Y a t-il un moyen plus propre pour savoir si on se trouve en
little ou big endian ?
Je predererais utiliser des #ifdef que faire un test de l'ordre des bits

Poser une question


Alain BARTHE
Juste une question : est-ce que les ntoh[ls] ne sont pas ce que tu
cherches ?
Cordialement,
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
La suggestion de JKB pourrait être un piste.
Il n'y a pas de constante unique à ma connaissance, mais en plus de
__i386, tu peux aussi tester __amd64 ou __x86_64
autoconf fournit un moyen assez fiable, sinon c'est un problème assez
complexe, comme expliqué dans ce fil de discussion (en Anglais) :
http://gcc.gnu.org/ml/gcc-help/2007...00342.html
--
DW
Ca pourrait etre une solution, mais je voulais passer par de la
compilation conditionnelle.
J'ai reecrit une surcouche de fread et fwrite que j'appelle
endian_read() et endian_write() qui permettent de lire a la maniere
fread() un nombre de champs de taille connue, tout en swappant les
octets si necessaire.
Je pourrais peut-etre utiliser ntoh[ls], mais ce me ferait reecrire mon
interface, ce que je voulais eviter.
J'ai juste besoin de savoir si je suis en little ou big endian.
J'ai effectivement trouve entre temps une solution avec :
#if defined(__i386) || defined(__x86_64)
#define HAVE_TO_SWAP
#endif
Il y aussi :
#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __LITTLE_ENDIAN)
qui fonctionne, mais uniquement sous Linux (ou GNU).
Sur Solaris, il y a apparemment, suivant architecture :
#define _BIG_ENDIAN 1 // sur sparc
#define _LITTLE_ENDIAN 1 // sur Intel
Je cherchais a savoir quelle etait la solution la plus "propre" et la
plus generale.
Apparemment, ce n'est pas aussi simple.
J'avais effectivement regarde comment marchait autoconf.
Si je me rappelle bien, ils ecrivent un entier 16 bits et regardent la
valeur du premier octet. Ca marche, mais il faut du code.
Merci pour ces infos.
Alain BARTHE
Certes, mais on trouve de tout et il y a des trucs un peu plus
tordus que petit et grand boutistes.
Je ne sais pas dans quel sens tournent les octets dits du réseau,
mais un truc aussi bête que if (x == ntohl(x)) devrait donner
quelque chose (à moins qu'il ne faille tester la différence).
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr