Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2550 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Parsage donnee

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Parsage donnee

n°1875424
jaydenlord
Posté le 20-04-2009 à 16:50:56  profilanswer
 

Bonjour,
Désolé de vous déranger mais dans le cadre d'un projet j'ai besoin a un moment donner de parser une suite de binaire et de les stocker dans un tableau.
J'ai vraiment besoin de votre aide parce que ca me bloque depuis un moment. Je n’arrive pas à trouver la solution.
Les données que je reçois sont hexadécimales et ont toujours la même forme:
Une première partie qu’on appellera requête et qui contient :
Un code annonçant le début de la séquence : 0x5C (caractère \),2 code ASCII (représentant le type de requête) ,2 octets (non ASCII).
Les deux octets de fin représentent la taille que fera la partie data qui suit la partie requête.
Exemple :
String \ F Z 5
Hex. 5C 46 5A 00 05
Ici la partie donnée aura donc une taille 5.
 
Dans la partie data qui contiendra des données on a :
Cette fois au début de chaque séquence de données on retrouve le code 23 symbole #,2 code ASCII (représentant le type de donnée) ,2 octets (non ASCII)..Et les deux octets de fin représente la taille de la donnée a traité.
Exemple :
String. # F I 5
Hex 23 46 49 00 05
Ce qui veut dire que des données de taille 5 suivront cette séquence.
 
Un exemple de séquence complète en hexadécimale serait (j’ai enlevé la partie donnée de cette séquence dans l’exemple hexadécimale qui sera dans ce cas ABCDE et qui viendra à la fin de la dernière séquence et que je mettrai juste dans la traduction string) :
5C 46 49 00 0A 23 46 4E 00 23 46 49 00 05
 
Qui donnerait en string:
\FI10#FN0#FI5ABCDE
 
Je voudrais stocker dans un tableau le parsage de ces données. Il faudrait donc pour résumer reconnaître la partie requête commençant par 5C(\) et la stocké reconnaître la taille de la partie data dans la partie requête. En fonction de cette taille, traité la partie donnée. En remarquant le code hexa 23 (#) annonçant le début d’une séquence de données. Et la taille de la donnée qui suivra le code séquence et la stockée elle aussi. Dans la partie données il ya plusieurs données qui peuvent se suivre mais il ya une seule partie requête. J’espère ne pas avoir été trop confus et vous remercie d’avance pour vos aides

mood
Publicité
Posté le 20-04-2009 à 16:50:56  profilanswer
 

n°1875512
Taz
bisounours-codeur
Posté le 20-04-2009 à 19:05:15  profilanswer
 

Et quel problème rencontres-tu ?

n°1875524
jaydenlord
Posté le 20-04-2009 à 19:24:34  profilanswer
 

Bonjour,
Voici la fonction que j’ai commence a écrire.Mais je pense quil y a plus simple et que je ne prends pas tout en compte.
J’aurai besoin d’aide pour faire quelque chose qui fonctionne mieux.
<code type="cpp">
bool parse( int* tab )
{   int k=0;
 int *rqst= NULL;
 int **data= NULL;
    rqst = new int[20];
    data = new int[20][20];
 for (int i =0;i<5;i++)
      {
  rqst[i]= tab[i];
      }
 
 for (int i =0;i<tab[4];i++)
      for (int j =0;j< 4+data[k][4];j++)
      {  int i;
   int j;
       data[k][j]=tab[i];
 
     if(data[k][j]== 23)
      {
       k++;
       j=0;
      }
      }
      }</code>

n°1875526
Taz
bisounours-codeur
Posté le 20-04-2009 à 19:26:50  profilanswer
 

data = new int[20][20];  
 
pas du C++.
 
utilise un vector de vector

n°1875536
jaydenlord
Posté le 20-04-2009 à 19:49:04  profilanswer
 

Taz a écrit :

data = new int[20][20];  
 
pas du C++.
 
utilise un vector de vector


 

Code :
  1. J’ai corrigé le code en utilisant un vector de vector. Mais je sais que jai encore dautre erreurs. Et que je ne prends pas tout en compte.
  2. vector< vector<int> > parse( int* tab )
  3. {   int k=0;
  4. int *rqst= NULL;
  5. // int **data= NULL;
  6. vector< vector<int> > data;
  7.     rqst = new int[20];
  8.     //data = new int[20][20];
  9. for (int i =0;i<5;i++)
  10.       {
  11.  rqst[i]= tab[i];
  12.       }
  13. for (int i =0;i<tab[4];i++)
  14.   {
  15.  for (int j =0;j< 4+data[k][4];j++)
  16.       {  int i;
  17.   int j;
  18.        data[k][j]=tab[i];
  19.     if(data[k][j]== 23)
  20.      {
  21.       k++;
  22.       j=0;
  23.      }
  24.       }
  25.       }
  26.       }


n°1875556
Taz
bisounours-codeur
Posté le 20-04-2009 à 20:16:46  profilanswer
 

rqst est inutile.
data n'est pas construit avec les bons paramètres.

n°1875566
jaydenlord
Posté le 20-04-2009 à 20:39:27  profilanswer
 

Taz a écrit :

rqst est inutile.
data n'est pas construit avec les bons paramètres.


 Voici une nouvelle version avec de nombreuses erreurs corrigees.
<code type="cpp">std::vector<Commande> parse(std::vector<char> tab)
 
{   int k=0;
    unsigned char *rqst= NULL;
        vector< vector<unsigned char> > data;
    rqst = new unsigned char[20];
         for (int i =0;i<5;i++)
      {
        rqst[i]= tab[i];
      }
 
    for (int i =0;i<tab[4]+256*tab[3];i++)
      {
        for (int j =0;j< 4+data[k][4];j++)
 
      {     int i=0;
            int j=0;
          data[k][j]=tab[i];
 
              if(data[k][j]== 0x23)
                  {
                      k++;
                      j=0;
                  }
      }
      }
      }</code>
 
Par contre je ne vois pas pourquoi rqst est inutile puisqu’il contient ma partie requête. Et le reste des infos sont des données. Je voulais séparer ces deux paramètres.
 
 
 

n°1875648
jaydenlord
Posté le 20-04-2009 à 23:39:51  profilanswer
 

Je complète encore le code.Je compte sur vos commentaires et vos conseils pour continuer d'améliorer cette méthode.
<code>
struct Parametre  
{
   Type type;
   std::string valeur;
};
struct Commande  
{
   Type type;
   std::vector<Parametre> parametres;
};
std::vector<Commande> parse(std::vector<char> tab)
 
{   int k=0;
    unsigned char *rqst= NULL;
        vector< vector<unsigned char> > data;
    rqst = new unsigned char[20];
         for (int i =0;i<5;i++)
      {
        rqst[i]= tab[i];
      }
 
    for (int i =0;i<tab[4]+256*tab[3];i++)
      {
        for (int j =0;j< 4+data[k][4];j++)
 
      {     int i=0;
            int j=0;
          data[k][j]=tab[i];
 
              if(data[k][j]== 0x23)
                  {
                      k++;
                      j=0;
                  }
      }
      }
      }</code>
 

n°1875649
Taz
bisounours-codeur
Posté le 20-04-2009 à 23:40:09  profilanswer
 

Taz a écrit :

rqst est inutile.
data n'est pas construit avec les bons paramètres.


Mêmes remarques.
 
rqst est inutile parce que justement tu as data qui va certainement pas se mettre à la bonne taille par l'opération du Saint-Esprit, Pâques venant tout juster de passer.

n°1875651
jaydenlord
Posté le 20-04-2009 à 23:56:54  profilanswer
 

Taz a écrit :


Mêmes remarques.
 
rqst est inutile parce que justement tu as data qui va certainement pas se mettre à la bonne taille par l'opération du Saint-Esprit, Pâques venant tout juster de passer.


Mince j'aurai du commencer cette partie plus tôt pour profiter du miracle de Pâques. Désolé de paraître idiot mais je ne vois en quoi la taille de data fait que rqst est inutile et comment faire pour que data prenne la taille nécessaire?

mood
Publicité
Posté le 20-04-2009 à 23:56:54  profilanswer
 

n°1875953
jaydenlord
Posté le 21-04-2009 à 17:45:13  profilanswer
 

Voila le code vraiment modifier et beaucoup plus avance. Merci pour vos opinions et/ou conseils.
 

Code :
  1. struct Parametre
  2. {
  3.    std::string type;
  4.    std::string valeur;
  5. };
  6. struct Commande
  7. {
  8.    std::string type;
  9.    std::vector<Parametre> parametres;
  10. };
  11. Commande parse(std::vector<char> tab);
  12. Commande parse(std::vector<char> tab)
  13. {
  14.     if ( tab.size() < 5 || tab[0] != 0x5C )
  15.     {
  16.         // Commande incorrecte
  17.         // Soit on renvoie une commande vide soit une exception
  18.         return Commande();
  19.     }
  20.     Commande commande;
  21.     // Lecture du type (2 caractères)
  22.     commande.type.assign(&tab[1], 2);
  23.     unsigned int taille = tab[3] * 256 + tab[4];
  24.     // On vérifie que tab a une taille suffisante
  25.     if ( tab.size() < taille + 5 )
  26.     {
  27.         // taille insuffisante pour tous les parametres
  28.         return Commande();
  29.     }
  30.     // position de la première valeur du premier paramètre
  31.     unsigned int offset = taille + 5;
  32.     for(unsigned int i = 5; i < taille + 5; i += 5)
  33.     {
  34.         if ( tab[i] != 0x23)
  35.         {
  36.             // Paramètre incorrecte
  37.             return Commande();
  38.         }
  39.         // Remplissage d'un nouveau paramètre
  40.         Parametre parametre;
  41.         parametre.type.assign(&tab[i+1], 2);
  42.         size_t taille_parametre = tab[ i + 3] * 256 + tab[i+4];
  43.         if ( tab.size() < offset + taille_parametre)
  44.         {
  45.             // taille insuffisante pour la valeur du paramètre
  46.             return Commande();
  47.         }
  48.         // Lecture de la valeur du paramètre
  49.         parametre.valeur.assign(&tab[offset], taille_parametre);
  50.         // positionnement pour le paramètre suivant
  51.         offset += taille_parametre;
  52.         // Ajout du paramètre à la commande
  53.         commande.parametres.push_back(parametre);
  54.     }
  55.     return commande;
  56. }
  57. //A la fin on a commande.parametres.size() pour avoir le nombre de paramètres de la commande, commande.parametres[i] pour accéder au paramètre i.

n°1875956
Taz
bisounours-codeur
Posté le 21-04-2009 à 17:47:31  profilanswer
 

Il te faut lire la documentation de vector pour connaître l'usage de son constructeur et de ses autres fonctions membres.

n°1876070
Lightness1​024
Posté le 21-04-2009 à 23:52:57  profilanswer
 

http://stdcxx.apache.org/doc/stdlibref/vector.html
http://www.sgi.com/tech/stl/Vector.html
 
faut s'y faire a ses docs, elles introduisent des termes qu'on appréhende mal au début. (tous les concepts notamment)


Message édité par Lightness1024 le 21-04-2009 à 23:53:40

---------------
http://projets.6mablog.com/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Parsage donnee

 

Sujets relatifs
Ajout de donnée sélectionner dans un tableauStructure de données pour stocker un couple
[matlab] Traitement de donnée/signalPolymorphisme dans base de donnée?
API en PHP4 qui crée un fichier XML respectant un DTD donnéeProblème de structure de base de donnée
Empecher lecture base de donnée (cryptage?)Relier JAVA à base de donnée MySQL distante / JDBC
Pb base de donnée sous access[optimisation] fichier txt -> insert base de donnée
Plus de sujets relatifs à : Parsage donnee


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR