IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Connaitre l'endianess d'une machine


Sujet :

C

  1. #1
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut 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.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef WORDS_BIGENDIAN
     
    #else 
     
    #endif
    Te permettra de savoir sur quel type d'architecture tu compiles...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut 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 ?
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  4. #4
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut 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.

    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...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut 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...
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut 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.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut 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() ?
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut 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!
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Wikipédia: Endianness
    Le protocole IP définit un standard, le network byte order (soit ordre des octets du réseau). Dans ce protocole, les informations binaires sont en général codées en paquets, et envoyées sur le réseau, l'octet de poids le plus fort en premier, c'est-à-dire selon le mode big-endian et cela quel que soit l'endianness naturel du processeur hôte.
    Donc, oui, Big Endian correspond à "Réseau", donc ça marche.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut 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.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/02/2011, 14h51
  2. Réponses: 5
    Dernier message: 29/04/2008, 14h30
  3. Réponses: 6
    Dernier message: 21/04/2008, 18h49
  4. pb : comment connaitre les groupes existants dans une machine Linux
    Par donkeyquote dans le forum Administration système
    Réponses: 4
    Dernier message: 11/03/2008, 11h26
  5. Comment connaitre les disques dur d'une machine dans un code ?
    Par GeekettePower dans le forum Langage
    Réponses: 3
    Dernier message: 27/06/2006, 00h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo