Extraire des bits successif d'un mot
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:
Code:
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;
} |
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
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