Bonjour,
Mon problème est le suivant
Je veux parcourir une trame réseau et en extraire des champ qui sont décrit dans un fichier de configuration sous cette forme:
champ1;num_octet;num_bitdedébut; num_bit de fn;
ex: champ1;0;0;15; champ1 doit avoir la valeur des 2 premiers octets
J'utilise le code suivant:
Quand il s'agit d'un champ s'étalant sur tout un octet ou sur 2 octets, je vérifie avec wireshark et la valeur de l_hsortval est conforme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 unsigned char *l_hdr = (unsigned char *)packet+14 //contient l'@ de début de la trame unsigned short l_shortval; unsigned short mask; memcpy(&l_shortval,l_hdr1,2); l_shortval=l_shortval<<8; mask=setMaskS(ntohs(l_shortval),s.deb_byte,s.end_byte,1); l_shortval=(l_shortval & mask)>>(s.deb_byte);//l_shortval predra la valeur du champ unsigned short CPeriodicMsg::resetBitS(unsigned short& b, int pos) { b = (unsigned short)(b & (~( 1 << pos))); return b; } unsigned short setMaskS(unsigned short b,int deb_byte, int end_byte,int mode) { unsigned short maskS=0xFFFF; int j; for(j=0;j<16;j++) { if((j<15-end_byte+1) || (j>15-deb_byte)) maskS=resetBitS(maskS,j); } return maskS; }
Par contre quand il s'agit d'un champ de cette forme
champ;0;5;12; (commence du 1er octets, mais à partir du son 6ème bit jusqu'au bit 5 de l'octet suivant) ici la valeur retournée est incorrecte, j'ai un doute que le mask n'est pas bien codé, mais j'ai pas su réglé le problème
S'il vous plait aidez-moi à le résoudre, c'est urgent
Merci
Partager