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 :
- int GetEndianMode()
- {
- unsigned short int *endian_test_value;
- unsigned char endiantest[2];
- endiantest[0]=0x12;
- endiantest[1]=0x34;
- endian_test_value=(unsigned short int*)endiantest;
- if (*endian_test_value==0x1234)
- {
- logdebug("big-endian architecture" );
- _static_library_endian_mode=GET_BIG_ENDIAN;
- }
- else
- {
- logdebug("little-endian architecture" );
- _static_library_endian_mode=GET_LITTLE_ENDIAN;
- }
- return _static_library_endian_mode;
- }
|
Et après tu utilises une fonction du genre pour manipuler tes données
Code :
- unsigned int GetEndianINT(unsigned char *ptr,int zemode)
- {
- unsigned int zevalue=0;
- zemode=GetAutoEndian(zemode);
- switch (zemode)
- {
- case GET_LITTLE_ENDIAN:zevalue=(*ptr)+256*(*(ptr+1))+65536*(*(ptr+2))+16777216*(*(ptr+3));break;
- case GET_BIG_ENDIAN: zevalue=16777216*(*ptr)+65536*(*(ptr+1))+256*(*(ptr+2))+(*(ptr+3));break;
- default:logerr("You must use GET_LITTLE_ENDIAN or GET_BIG_ENDIAN" );exit(INTERNAL_ERROR);
- }
- return zevalue;
- }
|
Message édité par edwoud le 19-03-2012 à 16:40:10