Emmanuel Delahaye C is a sharp tool | pierrot_lefou a écrit :
J'ai un tableau de char qui représente le contenu d'une trame reçue avec un protocole quelconque. du style :
char toto[10]={0x00, 0x01, 0x02, 0x03 ......... 0x09}
|
Déjà, je conseille d'utiliser unsigned char pour ce genre de chose. C'est plus 'neutre'...
Citation :
Je veux faire un parcours de ce tableau remplir une structure.
Or dans cette structure, j'ai des char, des unsigned int, des unsigned long... enfin différents types quoi. Prenons le cas où le premier élément de ma structure est un unsigned long (4 octets).
Certes, je peux parcourir toto, élément par élément et faire des décalages de 8 bits à chaque char lu, par exemple : /****************************************************/
char toto[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}
int i;
unsigned long MonLong=0;
for (i=0; i<4; i++)
{
MonLong=MonLong<<8; /*Pour i=0, on décale 0 de 8 bits, donc on a toujours 0*/
MonLong=MonLong+toto[i];
}
/****************************************************/
--> Certes, ca marche, mais je suppose qu'en faisant un cast, il y a moyen en une seule instruction d'affecter à MonLong les 4 premiers char.
|
A condition d'utiliser unsigned int et d'être conforme à la spécification des octets du réseau, la solution que tu as utilisé est la seule qui soit portable. Je te conseille de t'y tenir.
En principe, on l'écrit directement en version 'déroulée. C'est plus efficace :
Code :
- unsigned char buffer[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
- unsigned long MonLong= 0;
- unsigned offset = 2;
- /* format 'reseau' : MSB en tete) */
- MonLong |= buffer [offset + 0] << (8 * (3 - 0)); /* CORRECTION */
- MonLong |= buffer [offset + 1] << (8 * (3 - 1));
- MonLong |= buffer [offset + 2] << (8 * (3 - 2));
- MonLong |= buffer [offset + 3] << (8 * (3 - 3));
|
on obtient : 0x02030405 dans MonLong.
sinon, on utilise ntohs() et ntohl() qui sont faits pour ça (en principe, livrés avec les sockets).
Message édité par Emmanuel Delahaye le 07-06-2006 à 18:51:04 ---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
|