Parsage donnee

Parsage donnee - C++ - Programmation

Marsh Posté le 20-04-2009 à 16:50:56    

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

Reply

Marsh Posté le 20-04-2009 à 16:50:56   

Reply

Marsh Posté le 20-04-2009 à 19:05:15    

Et quel problème rencontres-tu ?

Reply

Marsh Posté le 20-04-2009 à 19:24:34    

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>

Reply

Marsh Posté le 20-04-2009 à 19:26:50    

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

Reply

Marsh Posté le 20-04-2009 à 19:49:04    

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.       }


Reply

Marsh Posté le 20-04-2009 à 20:16:46    

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

Reply

Marsh Posté le 20-04-2009 à 20:39:27    

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.
 
 
 

Reply

Marsh Posté le 20-04-2009 à 23:39:51    

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>
 

Reply

Marsh Posté le 20-04-2009 à 23:40:09    

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.

Reply

Marsh Posté le 20-04-2009 à 23:56:54    

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?

Reply

Marsh Posté le 20-04-2009 à 23:56:54   

Reply

Marsh Posté le 21-04-2009 à 17:45:13    

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.

Reply

Marsh Posté le 21-04-2009 à 17:47:31    

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

Reply

Marsh Posté le 21-04-2009 à 23:52:57    

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/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed