IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Extraire des bits successif d'un mot


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Points : 28
    Points
    28
    Par défaut 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 : 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;
     
    }
    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

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Je pense qu'il y a déjà une erreur ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l_shortval=l_shortval<<8;
    Là tu jartes carrément le premier octet. Franchement ton code n'est pas évident à comprendre, et en fonction de l'endianess, marchera ou pas.

    Je te conseille d'utiliser un papier / crayon et de dessiner les déplacements de bit que tu fais. Tu comprendras peut-être mieux après.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Points : 28
    Points
    28
    Par défaut
    Bonjour à tous, je reviens à ce thread. En fait j'ai essayé de régler le problème mais en vain je ne suis pas arrivée, si quelqu'un a une nouvelle idée ou un nouveau algo différent du mien prière de le diffuser, tout en pensant à laisser le mécanisme de lecture de la longueur de chaque champ à travers le fichier texte de configuration
    Merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/07/2008, 16h36
  2. [Tableaux] Extraire des mots d'une chaine de caractères
    Par pratiquement dans le forum Langage
    Réponses: 5
    Dernier message: 24/01/2008, 09h20
  3. [MySQL] extraire des mots concaténés ensemble pour en faire des liens
    Par oim dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/11/2007, 04h32
  4. extraire des mots à partir d'une chaine
    Par freestyler dans le forum Delphi
    Réponses: 5
    Dernier message: 28/09/2006, 15h04
  5. extraire un bit d'un mots
    Par Emcy dans le forum C
    Réponses: 4
    Dernier message: 04/09/2006, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo