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

C++ Discussion :

Pb de découpe de trames


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Par défaut Pb de découpe de trames
    Bonjour!
    J'ai une trame que je dois découper en champs, mais mon problème est que certains champs n'ont pas une taille fixe; J'aurais aimé faire une déclaration type champs de bits mais ce n'est pas possible avec les strings

    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
    struct ETI_NI
    {       
           string Erreur;
           string Fsync;
           string FCT;
           string FICF;
           string NST;
           string FP;
           string MID;
           string FL;
           string STC;
           string EOH;
           string MST;
           string EOFile;
           string TIST;
           string Padding;
     
          //Décomposition de la trame en champs
           void Attribute_fields (string trame_ok)
           {
                Erreur = trame_ok.substr(0,8); 
                Fsync = trame_ok.substr(8,24); 
                FCT = trame_ok.substr(32,8);
                FICF = trame_ok.substr(40,1);
                NST = trame_ok.substr(41,7);
                FP = trame_ok.substr(48,3); 
                MID = trame_ok.substr(51,2);
                FL = trame_ok.substr(53,11);              
     
     
           }
     
     
    };
    Mon champs STC sera de taille variable en fonction de la valeur de NST (J'ai déjà crée la fonction convertissant du string vers le décimal)

    QQun peut m'aider?
    Merci

  2. #2
    Membre éclairé Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Si j'ai bien compris c'est uen grosse chaine de caracteres composée de tes champs mis les uns apres les autres.

    Le plus simple je pense si tes champs ont des tailles variables, c'est de délimitier chaque champ par un caractère de contrôle dans ta trame.

    genre

    $ERREUR;FSYNC;FCT;...

    en général j'utilise cette syntaxe, le $ pour un début de ligne et le ; pour délimiter les champs.

    Apres tu n'as plus qu'a lire ta trame de point virgule a point virgule pour réupérer les champs un par un

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Par défaut
    Ouaip l'idée de jehrikhan me plait bien (mais tu ne pourra plus utiliser le ";" dans chacun de tes champs.

    Tu peux aussi definire une taille max pour tes champs variables et completer les trames avec des espaces que tu supprimeras facilement par la suite.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Par défaut
    En fait c'est une trame que je reçois par usb, et que je dois découper selon un format pré-établi, afin de pouvoir extraire certaines informations.
    Je ne peux pas insérer de caractères.

    Par exemple le champ STC fait (NST*4) octets

  5. #5
    Membre éclairé Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Citation Envoyé par Julgood Voir le message
    Par exemple le champ STC fait (NST*4) octets
    Je ne comprend pas très bien. Il y a un rapport fixe entre les tailles de tes champs? un rapport de 4 pour ton exemple en l'occurence.

    Dans ce cas je vois pas trop le soucis alors, si tu as NST tu as STC, il te suffit de calculer sa valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Erreur = trame_ok.substr(0,8); 
                Fsync = trame_ok.substr(8,24); 
                FCT = trame_ok.substr(32,8);
                FICF = trame_ok.substr(40,1);
                NST = trame_ok.substr(41,7);
                FP = trame_ok.substr(48,3); 
                MID = trame_ok.substr(51,2);
                FL = trame_ok.substr(53,11);  
                STC = trame_ok.substr(64, NST*4);
    pour les champs suivants, qui sont si j'ai tout compris fixes, il te suffit de récupérer a ce moment la ta position, et ensuite de travailler dessus
    Sans oublier bien sur de convertir NST en int


    pour la suite je pars de la base que les champs restant sont tous fixes pour une longueur de 10 caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     EOH =trame_ok.substr(pos,10) ;
              pos+=10;
              MSTtrame_ok.substr(pos,10) ;
              pos+=10;
              EOFile=trame_ok.substr(pos,10) ;
              pos+=10;
              TIST=trame_ok.substr(pos,10) ;
              pos+=10;
              Padding=trame_ok.substr(pos,10) ;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Par défaut
    Je ne comprend pas très bien. Il y a un rapport fixe entre les tailles de tes champs? un rapport de 4 pour ton exemple en l'occurence.

    Dans ce cas je vois pas trop le soucis alors, si tu as NST tu as STC, il te suffit de calculer sa valeur.
    Pareil ...

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Par défaut
    C'est bon j'ai réussi!
    Merci de votre aide

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 61
    Par défaut
    bin dis nous comment tu as fait ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Levison sur un signal découpé en trames
    Par NEKABSMAIL dans le forum Signal
    Réponses: 2
    Dernier message: 06/05/2011, 16h57
  2. Obtenir une trame Ethernet
    Par Scorff dans le forum Développement
    Réponses: 15
    Dernier message: 11/09/2006, 12h22
  3. [TComPort] -> Pb de trame non complète ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/04/2004, 14h22
  4. Réponses: 2
    Dernier message: 04/02/2004, 22h32
  5. redirection de trames
    Par Fry dans le forum Développement
    Réponses: 2
    Dernier message: 06/01/2004, 13h31

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