begin process at 2012 05 30 01:33:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Compression, Split & Cryptage

 > 

Parsage tableau


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Parsage tableau

mercredi 22 avril 2009 à 16:54:58 | Parsage tableau

JAYDEN

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 ecris une fonction pour ce parsage mais je me rends compte quil est incomplet et doit etre ameliore pour etre vraiment fonctionnel. Voila mon probleme :
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.Voila mon code. Je compte sur vous pour m'aider a l'ameliorer et le corrigé:
[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.
  12. Commande parse(std::vector<char> tab);
  13.
  14. Commande parse(std::vector<char> tab)
  15. {
  16.     if ( tab.size() < 5 || tab[0] != 0x5C )
  17.     {
  18.         // Commande incorrecte
  19.
  20.         // Soit on renvoie une commande vide soit une exception
  21.         return Commande();
  22.     }
  23.
  24.     Commande commande;
  25.
  26.     // Lecture du type (2 caractères)
  27.     commande.type.assign(&tab[1], 2);
  28.
  29.     unsigned int taille = tab[3] * 256 + tab[4];
  30.
  31.     // On vérifie que tab a une taille suffisante
  32.     if ( tab.size() < taille + 5 )
  33.     {
  34.         // taille insuffisante pour tous les parametres
  35.         return Commande();
  36.     }
  37.
  38.     // position de la première valeur du premier paramètre
  39.     unsigned int offset = taille + 5;
  40.
  41.     for(unsigned int i = 5; i < taille + 5; i += 5)
  42.     {
  43.         if ( tab[i] != 0x23)
  44.         {
  45.             // Paramètre incorrecte
  46.             return Commande();
  47.         }
  48.
  49.         // Remplissage d'un nouveau paramètre
  50.         Parametre parametre;
  51.         parametre.type.assign(&tab[i+1], 2);
  52.
  53.         size_t taille_parametre = tab[ i + 3] * 256 + tab[i+4];
  54.
  55.         if ( tab.size() < offset + taille_parametre)
  56.         {
  57.             // taille insuffisante pour la valeur du paramètre
  58.             return Commande();
  59.         }
  60.
  61.         // Lecture de la valeur du paramètre
  62.         parametre.valeur.assign(&tab[offset], taille_parametre);
  63.
  64.         // positionnement pour le paramètre suivant
  65.         offset += taille_parametre;
  66.
  67.         // Ajout du paramètre à la commande
  68.         commande.parametres.push_back(parametre);
  69.     }
  70.     return commande;
  71. }
  72. //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.[/CODE]
Merci davance pour vos aides.


Cette discussion est classée dans : taille, code, commande, tab, partie


Répondre à ce message

Sujets en rapport avec ce message

Demande d'explication a propos d'un code. [ par Strick9 ] Salut à tous, j'ai obtenu grâce à se merveilleux site ce code sources pour cet énoncés:un programme permettant de donner toute les combinaison suite a Pour les pros -> Incidence de la STL sur la taille du code. [ par lordkraken ] Bonjour,j'essaie de minimiser la taille du code. d'une petite DLL que je programme actuellement.Or j'utilise depuis hier des vector, issus directement Comment ecrire une commande sous MS-DOS [ par salley ] Voila, j'aimerais que mon programme ecrive la ligne suivante dans le "command prompt" (sous MS-DOS) automatiquement. scheduler report.txt <br Corrigez mon code? Comment récupérer la taille d'un fichier? [ par supergrey ] Bonjour j'utilise pour l'instant la fonction suivante pour récupérer la taille d'un fichier: DWORD TailleFichier(char* str_NomFichier){     HANDLE hFi Ping et mise à jour dns [ par Cuty74 ] Bonjour à tous,je suis un débutant en programmation et je misere sur un sujet.J'ai comme projet de faire un logiciel qui ping une adresse ip, et si ce explication sur une commande de tempo [ par mkal ] bonjours voila mon probleme: Mon prof d'info nous a donnée pendant un cours, un code qui realise une temporisation.le truc c'est que le code n'est pas Taille TAB CONTROL [ par goutbouyo ] Salut,J'ai crée un TAB CONTROL et j'ai crée une dialog box pour chaque onglet du tab control.Maintenant j'aimerais ajuster la taille du dialog box pou je m'arrache les cheveu avec mes tableau [ par slyiut ] bonjour je dois faire un exo qui est la fusion de 2 tableau triés dans un troisieme tableau.Je sais qu'il y a sur le net plein de solution mais ce que Commande Systeme [ par joh ] Voila mon probleme ,j'utilise ShellExecute() (ds un prog en C++ sous Visual6) pour appeler OutLook et le remplire sa marche sauf que je n arrive pas a Prob de modulo ou de code ? [ par NeoZ ] Salut, je voudrais stocker un nombre dans un tableau, ou tout du moins, stocker chaque chiffre dans une variable, et j'ai fait ce bout de code, mais i


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,530 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales