Endianness.

Les processeurs little endian ou big endian

Voir version :

Pas de dépendances

Télécharger :

#include <stdio.h>

int endian_test()
{
    char t[2]={0,1};
    short* s = (short*)(&(t[0]));
    if (*s==256)
        return 1;
    else
        return 0;
}

int main()
{
    if (endian_test()==1)
        printf("Vous utilisez un processeur Little Endian (Intel ?)\n");
    else
        printf("Vous utilisez un processeur Big Endian (Motorola ?)\n");
    return 0;
}



Commentaires

   Voici un probleme ignoré par énormément de personnes : le test "Endian"
	--> Il n'est d'ailleurs pas utile de connaitre ces problemes si vous n'etes pas un programmeur réseau ou de reverse engeneering.
	--> Vous pouvez tout a fait faire des jeux vidéo classique en ignorant ces problemes.

  Lancez le prog : si vous etes sur un mac, vous irez dans la partie Big Endian du if, si vous etes sur un PC, vous irez
  dans la partie Little Endian.

  * notez que pas mal de mac maintenant fonctionnent en little endian.

  Si vous etes sur une station Unix, vous irez peut etre dans la partie Big Endian...
  Bref, pour comprendre, il faut descendre directement a la façon de procéder du processeur :

  Question :
  Comment, et dans quel ordre, est stocké un short en mémoire (le short fait 2 octets)

  Soit le short "1"
  Sa représentation 'logique' en mémoire est, sur 2 octets :

  00 01

  Félicitation, vous venez de trouver la réprésentation en Big Endian du nombre "1" en mémoire sous 2 octets...

  Maintenant, imaginez la représentation suivantes :

  01 00

  --> les 2 octets sont inversés. Voici la représentation Little Endian.

  Passons a un LONG :
  sous 4 octets : le nombre 274 (en hexa : 274 = 0x112)

  En Big Endian :
  00 00 01 12

  En Little Endian :
  12 01 00 00

  --> Les octets sont lus tantot de gauche a droite, tantot de droite a gauche, comme les short.

* Pourquoi tous les processeurs n'utilisent ils pas tous la meme représentation des nombres ?
--> Réponse A : Pour faire chier le monde.
--> Réponse B : Pour des raisons d'efficacité de calcul...

Il faut retenir les 2 réponses.

* Et pour les réseaux : pour internet, si vous avez un PC, et que vous voulez communiquer avec un mec qui a un mac :
Plusieurs possibilités :
1) Ne passer que des octets 1 par 1 (pas de soucis), jamais de long ou de short.
2) Vous devez savoir si le gars d'en face a un mac ou un PC, et, en fonction de ce que vous avez, les données sont passées
différemment.

--> Les 2 réponses sont inacceptables.

Réponse :
Internet et les réseaux en général fonctionnent en Big Endian : c'est a dire que tous les short ou long envoyés doivent
etre envoyés en big Endian si vous voulez qu'on vous relise derriere : c'est une norme.
(notamment l'adresse des ports !!)
C'est une norme.

Apres, bien sur, entete des trames mises a part, les données pures qui sont dans la trame peuvent etre structurées comme
vous voulez ! (si vous faites un programme qui ne communique qu'avec des PC, vous pouvez garde le little Endian...)
Mais les headers des trames, qui eux assurent un bon routage de vos données, doivent etre assurés en Big Endian.

En réseau, les fonctions qui convertissent un nombre pour assurer qu'il sera lisible sur le net :

short htons(short)   : (Host To Network Short) renverse le short si le pross est Little Endian, ne fait rien si il est Big Endian.
long htonl(long) : Pareil pour long
short ntohs(short) : l'inverse
long ntohl(long)

Un bon programmeur réseau doit utiliser ces fonctions.