Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
902 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Sens d'écriture nombres hexadécimaux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Sens d'écriture nombres hexadécimaux

n°2131997
nisalon_ca​je
Posté le 19-03-2012 à 02:48:08  profilanswer
 

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
mood
Publicité
Posté le 19-03-2012 à 02:48:08  profilanswer
 

n°2132004
xilebo
noone
Posté le 19-03-2012 à 09:13:31  profilanswer
 

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 :)

n°2132044
breizhbugs
Posté le 19-03-2012 à 11:26:18  profilanswer
 

Essai de faire un ntohl() dessus?


---------------
Seul Google le sait...
n°2132110
nisalon_ca​je
Posté le 19-03-2012 à 15:59:07  profilanswer
 

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/
n°2132111
edwoud
⭐ shériff de l'espace
Posté le 19-03-2012 à 16:38:56  profilanswer
 

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
n°2132114
Terminapor
I'll see you rise.
Posté le 19-03-2012 à 16:56:57  profilanswer
 

Y'a pas les byteshifts en C ?


---------------
Perhaps you don't deserve to breathe
n°2132145
edwoud
⭐ shériff de l'espace
Posté le 19-03-2012 à 22:55:02  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Sens d'écriture nombres hexadécimaux

 

Sujets relatifs
urgent : macro ecriture sur classeur excelecriture sur plusieurs xls
Probleme d'écriture sur un scriptConversion en binaire et écriture dans un fichier
Erreur d'écriture de fichier RMAN ORA-27040 OracleProblème-écriture-image-GIF
Problème-écriture-image-GIF[VB.NET] Lecture et écriture
Savoir si un .zip est en cours d'écritureLimite des nombres réels en prog
Plus de sujets relatifs à : Sens d'écriture nombres hexadécimaux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR