GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 15 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JKB
Le #23302751
Le Fri, 22 Apr 2011 10:56:25 +0200,
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...



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
Damien Wyart
Le #23302791
* Alain BARTHE
Je dois determiner dans un code si je suis en architecture little ou
big endian, pour swapper ou non les octets de certains champs.



La suggestion de JKB pourrait être un piste.

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)



Il n'y a pas de constante unique à ma connaissance, mais en plus de
__i386, tu peux aussi tester __amd64 ou __x86_64

2) Y a t-il un moyen plus propre pour savoir si on se trouve en
little ou big endian ?



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
Alain BARTHE
Le #23302891
Le 22/04/2011 13:15, JKB a écrit :
Le Fri, 22 Apr 2011 10:56:25 +0200,
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...



Juste une question : est-ce que les ntoh[ls] ne sont pas ce que tu
cherches ?

Cordialement,

JKB



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.
Alain BARTHE
Le #23302911
Le 22/04/2011 13:59, Damien Wyart a écrit :
* Alain BARTHE
Je dois determiner dans un code si je suis en architecture little ou
big endian, pour swapper ou non les octets de certains champs.



La suggestion de JKB pourrait être un piste.

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)



Il n'y a pas de constante unique à ma connaissance, mais en plus de
__i386, tu peux aussi tester __amd64 ou __x86_64



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.



2) Y a t-il un moyen plus propre pour savoir si on se trouve en
little ou big endian ?



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



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.
JKB
Le #23303091
Le Fri, 22 Apr 2011 14:40:18 +0200,
Alain BARTHE
Le 22/04/2011 13:15, JKB a écrit :
Le Fri, 22 Apr 2011 10:56:25 +0200,
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...



Juste une question : est-ce que les ntoh[ls] ne sont pas ce que tu
cherches ?

Cordialement,

JKB



Ca pourrait etre une solution, mais je voulais passer par de la
compilation conditionnelle.



Certes, mais on trouve de tout et il y a des trucs un peu plus
tordus que petit et grand boutistes.

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.



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
Publicité
Suivre les réponses
Poster une réponse
Anonyme