Parser une chaine en pour placer dans un tableau

cs_JAYDEN Messages postés 4 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 22 avril 2009 - 17 avril 2009 à 22:16
cs_JAYDEN Messages postés 4 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 22 avril 2009 - 20 avril 2009 à 20:36
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. 

3 réponses

cs_JAYDEN Messages postés 4 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 22 avril 2009
20 avril 2009 à 19:28
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.


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;

      }

      }

      }
0
cs_JAYDEN Messages postés 4 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 22 avril 2009
20 avril 2009 à 19:50
J’ai corrigé le code en utilisant un vector de vector. Mais je sais que j’ai encore d’autre erreurs. Et que je ne prends pas tout en compte.

vector< vector > parse( int* tab )
{   int k=0;
    int *rqst= NULL;
//    int **data= NULL;
    vector< vector > data;
    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;
                  }
      }
      }
      }
/cpp
Merci pour vos conseils.
0
cs_JAYDEN Messages postés 4 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 22 avril 2009
20 avril 2009 à 20:36
 Voici une nouvelle version avec de nombreuses erreurs corrigees.
std::vector<Commande> parse(std::vector<char> tab)

{   int k=0;
    unsigned char *rqst= NULL;
        vector< vector > 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;
                  }
      }
      }
      }

Par contre je ne vois pas a quoi sert la classe commande. Pourrais tu m’éclairer stp?
0
Rejoignez-nous