Sens d'écriture nombres hexadécimaux

Sens d'écriture nombres hexadécimaux - C - Programmation

Marsh Posté le 19-03-2012 à 02:48:08    

Bonjour

 

Je suis en train d'essayer de comprendre un flux réseau capté par Wireshark.
Ce flux commence par : 0x17 0x03 0x01 0x00   (wireshark me propose de stocker ca dans un tableau c :

Code :
  1. char peer0_0[] = { 0x17, 0x03, 0x01, 0x00};

)

 

En supposant que ceci soit un int (corrigez moi si je me trompe, mais selon moi ces 4 char mis bout à bout forment bien un int, non ?), de quel int s'agit-il ?
De 0x17030100 ?
De 0x00010317 ?

 

D'un autre ?

 


Merci d'avance :D


Message édité par nisalon_caje le 19-03-2012 à 02:49:56
Reply

Marsh Posté le 19-03-2012 à 02:48:08   

Reply

Marsh Posté le 19-03-2012 à 09:13:31    

Salut,
 
Voir article http://fr.wikipedia.org/wiki/Endianness
 
 

Citation :

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.


 
Ca devrait répondre à ta question :)

Reply

Marsh Posté le 19-03-2012 à 11:26:18    

Essai de faire un ntohl() dessus?


---------------
Seul Google le sait...
Reply

Marsh Posté le 19-03-2012 à 15:59:07    

parfait merci :)
et quand j'écris dans un fichier via un fwrite, est-ce que l'octet de poids fort ou celui de poids faible en premier ?


---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 19-03-2012 à 16:38:56    

nisalon_caje a écrit :

parfait merci :)
et quand j'écris dans un fichier via un fwrite, est-ce que l'octet de poids fort ou celui de poids faible en premier ?


 
tout dépend de ta machine (big endian, little endian)
 
le mieux est de te faire une petite librairie qui détermine si l'hôte est big ou little endian
 
ensuite, tu travailles selon le mode dont tu as besoin (certains formats utilisent l'un des deux modes par défaut, d'autres utilisent les deux modes et précisent dans la trame le mode qu'ils utilisent, etc.)
 

Code :
  1. int GetEndianMode()
  2. {
  3. unsigned short int *endian_test_value;
  4. unsigned char endiantest[2];
  5. endiantest[0]=0x12;
  6. endiantest[1]=0x34;
  7. endian_test_value=(unsigned short int*)endiantest;
  8. if (*endian_test_value==0x1234)
  9. {
  10.  logdebug("big-endian architecture" );
  11.  _static_library_endian_mode=GET_BIG_ENDIAN;
  12. }
  13. else
  14. {
  15.  logdebug("little-endian architecture" );
  16.  _static_library_endian_mode=GET_LITTLE_ENDIAN;
  17. }
  18. return _static_library_endian_mode;
  19. }


 
Et après tu utilises une fonction du genre pour manipuler tes données
 

Code :
  1. unsigned int GetEndianINT(unsigned char *ptr,int zemode)
  2. {
  3. unsigned int zevalue=0;
  4. zemode=GetAutoEndian(zemode);
  5. switch (zemode)
  6. {
  7.  case GET_LITTLE_ENDIAN:zevalue=(*ptr)+256*(*(ptr+1))+65536*(*(ptr+2))+16777216*(*(ptr+3));break;
  8.  case GET_BIG_ENDIAN:   zevalue=16777216*(*ptr)+65536*(*(ptr+1))+256*(*(ptr+2))+(*(ptr+3));break;
  9.  default:logerr("You must use GET_LITTLE_ENDIAN or GET_BIG_ENDIAN" );exit(INTERNAL_ERROR);
  10. }
  11. return zevalue;
  12. }


Message édité par edwoud le 19-03-2012 à 16:40:10
Reply

Marsh Posté le 19-03-2012 à 16:56:57    

Y'a pas les byteshifts en C ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 19-03-2012 à 22:55:02    

Terminapor a écrit :

Y'a pas les byteshifts en C ?


 
Si, si, et c'est optimisé tel quel en code compilé depuis plus de 20 ans (voir avec des LEA sur x86 pour d'autres valeurs que les puissances de deux)
 
Mais j'ai une vieille habitude de ne jamais les utiliser sur des unsigned, à cause d'un bug de compilateur microsoft qui fait le shift en signé (avec réinjection du bit le plus significatif quand on s'en sert pour diviser par une puissance de deux) :jap:  
 
Ils ont peut-être corrigé ce bug depuis, mais bon. Dans le doute  :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed