Parsage donnee - C++ - Programmation
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>
Marsh Posté le 20-04-2009 à 19:26:50
ReplyMarsh Posté le 20-04-2009 à 19:49:04
Taz a écrit : data = new int[20][20]; |
Code :
|
Marsh Posté le 20-04-2009 à 20:16:46
ReplyMarsh Posté le 20-04-2009 à 20:39:27
Taz a écrit : rqst est inutile. |
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.
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>
Marsh Posté le 20-04-2009 à 23:40:09
Taz a écrit : rqst est inutile. |
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.
Marsh Posté le 20-04-2009 à 23:56:54
Taz a écrit : |
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?
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 :
|
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.
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)
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