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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Convertir Chaine de caractères vers hexa

n°1324419
Thordax
Shop smart. Shop S-Mart !
Posté le 13-03-2006 à 17:37:46  profilanswer
 

Reprise du message précédent :
bon j'arrive a un truc pas mal mais c'est pas encore ce que je veux :
 

Code :
  1. #include <fstream.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <iostream.h>
  5. #include <string>
  6. #include <sstream>
  7. #include <algorithm>
  8. #include <cstring>
  9. #include <vector.h>
  10. using namespace std;
  11. int main(){
  12.    
  13.     char fichier_a_traiter[50];
  14.     //std::vector<int> pos_E14D; // vecteur positions E14D
  15.    
  16.     cout << "Outil d'Analyse Des flux de communication 3g." << endl;
  17.     cout << endl << "Quel fichier desirez vous traiter ? \n(note : le fichier doit etre dans le repertoire en cours)" << endl;
  18.     cout << "Fichiers du repertoire : " << endl;
  19.     system("ls -a" ); //listing du répertoire
  20.     cin >> fichier_a_traiter;
  21.     cout << "Vous souhaitez traiter :" << fichier_a_traiter << endl;
  22. //balayage des valeurs du nouveau fichier
  23.     FILE *file = fopen("sony2in.rec" , "rb" );
  24.     char *chaine_recherchee = "14d"; //trame a chercher
  25.     char premier_octet=101;
  26.     char *chaine_trouvee;
  27.     char c;
  28.     int position=0;
  29.     //cout << endl << "Premier octet : " << premier_octet << endl;
  30.    
  31.  
  32.     int n, len1, len2;
  33.     if (file==NULL) perror ("Error opening file" );
  34.   else
  35.   {
  36.  
  37.     while(!feof(file))
  38.     {position++;
  39.      if( (c=fgetc(file)) == premier_octet )
  40.          {   
  41.        
  42.          fgets (chaine_trouvee , 4 , file);
  43.    
  44.          n=strcmp (chaine_recherchee, chaine_trouvee);
  45.          //cout << n;
  46.          //cout << "Chaine recherchee : " << chaine_recherchee<< endl << "Chaine trouvee : " << chaine_trouvee << endl;
  47.    
  48.          if(n==0){       
  49.          //cout << "chaine trouvee en position : " << position << endl;     
  50.          //position = position +3;}}
  51.          cout << fgets (chaine_trouvee+4 , 7 , file);}}
  52.        
  53.          }
  54.      }
  55. system("PAUSE" );
  56. }


 
en effet, dans mon fichier de test, il n'y a pas les caractères E14D, mais bel et bien : áM soit leur correspondance ASCII. Comment faire le lien ? faire une recherche du premier caractère á puis faire un strcomp jusqu'à tomber sur M ?

mood
Publicité
Posté le 13-03-2006 à 17:37:46  profilanswer
 

n°1324423
skelter
Posté le 13-03-2006 à 17:43:37  profilanswer
 

c'est buggée tout ca (utilisation de feof, chaine_trouvee invalide, melange c et c++)
 
deja commences par choisir entre c et c++

n°1324428
Thordax
Shop smart. Shop S-Mart !
Posté le 13-03-2006 à 17:53:33  profilanswer
 

explique moi je ne vois pas où est le problème
 
et puis pourquoi choisir si ca marche comme ca ?
 
Y a t il des conflits entre les deux langages ? ou sont les problèmes d'initialisation ? feof, ce n'est pas cohérent ? je dois utiliser un pointeur ?
 
Pourquoi chaine_trouvee est invalide ? ce n'est pas un char* ?

n°1324435
skelter
Posté le 13-03-2006 à 18:10:03  profilanswer
 

Citation :

et puis pourquoi choisir si ca marche comme ca ?


 
c'est facile d'interfacer du c avec du c++, c'est parfois nécéssaire (quand l'équivalent c++ n'existe pas, mais la il y a des manieres propre de le faire) mais la tout ce que tu fais peut se faire sans appels à des fonctions de la bibliothèques standard C
FILE -> fstream
utilises std::string au lieu de char* et des fonctions déclarées dans string.h
 

Citation :

feof, ce n'est pas cohérent ?


Taz te l'a expliqué plusieurs fois, il suffit pourtant de lire la doc ??
 

Citation :

Pourquoi chaine_trouvee est invalide ? ce n'est pas un char* ?


il n'est pas initialisé (avec une adresse valide)

n°1324438
Thordax
Shop smart. Shop S-Mart !
Posté le 13-03-2006 à 18:14:54  profilanswer
 

Taz m'a dit :

Citation :

#  
 while(!feof(file))  
#  
   {  
#  
    if( (c=fgetc(file)) == premier_octet )  
 
 
 
boom  
 
 
while((c = fgetc(input)) != EOF) { travailleur sereinement }  
 
 
 
#  
    fgets (chaine_trouvee , 1 , file);  
#        
#  
    n=memcmp ( chaine_recherchee, chaine_trouvee, len1>len2?len1:len2 );  
 
t'as un problème. tantot tu consideres que ton entrée c'est du texte (ici des lignes) tantot que c'est du binaire ...  
 
 
et len1 et len2 ne sont pas initialisées.  
et puis à part le cout, c'est du C ta daube.
 


 
je ne vois pas ce qu'il m'explique au niveau de feof ...
 
quant à "chaine_trouvee" quel genre d'adresse lui faut il ? il me semblait qu'une initialisation de ce type suffisait largement.
 
Par ailleurs l'utilisation des streams permet-elle de faire une recherche du même type qu'avec les fonctions de type fgetc et autres ?
 
Je n'arrive toujours pas à rechercher la trame E14D, dois je faire une recherche en binaire ? genre memcmp("0001 0100 1101" ) après avoir récupéré le premier octet ("1110" ) ?

n°1324444
skelter
Posté le 13-03-2006 à 18:22:22  profilanswer
 

pour feof il t'a donnée la bonne utilisation (lecture tant que c'est possible)
 

Code :
  1. while((c = fgetc(input)) != EOF) { travailleur sereinement }


 
mais c'est en C, si tu es dans la cat c++ fais du c++ ou déplaces dans la cat C
 

Citation :

quant à "chaine_trouvee" quel genre d'adresse lui faut il ? il me semblait qu'une initialisation de ce type suffisait largement.


 
pourquoi tu utilises un pointeur si tu ne comprends pas ce que c'est ? on ne programme pas au filling !
 
serieusement il te manque beaucoup de bases pour commencer à faire ce que tu fais, et choisi un langage avant tout (tu à l'air plus parties pour du C)

n°1324478
Thordax
Shop smart. Shop S-Mart !
Posté le 13-03-2006 à 19:16:14  profilanswer
 

ok tant pis je vais sur un forum ou les gens me répondront plutot que de me casser ...

n°1324809
franceso
Posté le 14-03-2006 à 10:01:09  profilanswer
 

Citation :

ok tant pis je vais sur un forum ou les gens me répondront plutot que de me casser ...


Il ne s'agit pas de te casser, mais plutôt de te faire partir sur de bonnes bases. Tu essaies de foncer tout droit vers l'objectif final de ton programme, alors que le squelette initial fait encore apparaître plein de bugs.
 
Comme te l'a dit skelter, tu devrais commencer par choisir ton langage (vu ce que tu as déjà fait, je te conseille de faire du C).
Ensuite, il faut que tu reprennes ton code existant pour le rendre propre : tes chaines de caractères doivent être allouées, la fin du fichier doit être gérée correctement
Seulement après, tu pourras t'attaquer à ton problème de recherche de trames binaires dans un flux.

n°1324866
Thordax
Shop smart. Shop S-Mart !
Posté le 14-03-2006 à 10:45:49  profilanswer
 

J'ai fait quelques modifs depuis, j'ai rendu le code un peu plus C++esque, même si, effectivement je suis encore loin du résultat... je vous montre ca :
 

Code :
  1. #include <fstream.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <iostream.h>
  5. #include <string>
  6. #include <sstream>
  7. #include <algorithm>
  8. #include <cstring>
  9. #include <vector.h>
  10. using namespace std;
  11. bool is_readable( const std::string & file )
  12. {
  13.     std::ifstream fichier( file.c_str() );
  14.     return fichier != 0;
  15. }
  16. int main(){   
  17.     char fichier_entre[50];
  18.     cout << endl << "Quel fichier desirez vous traiter ? \n(note : le fichier doit etre dans le repertoire en cours)" << endl;
  19.     cout << "Fichiers du repertoire : " << endl;
  20.     system("ls -a" ); //listing du répertoire  
  21.     cin >> fichier_entre;
  22.     cout << "Vous souhaitez traiter :" << fichier_entre << endl;
  23. //ouverture fichier  
  24.     ifstream fichier;
  25.     fichier.open ("fichier_entre", ios::binary );
  26.    
  27.    
  28. //le fichier existe t il  
  29. if ( !is_readable( "fichier_entre" ) )
  30.     {
  31.         cout << "Fichier inexistant ou non lisible.\n";
  32.     }
  33. //recherche trames     
  34.    
  35.    
  36. //MISE EN BUFFER  
  37.        std::ostringstream ossBuffer;
  38.        ossBuffer << fichier;
  39.        std::string Buffer = ossBuffer.str();
  40.        
  41.        // manipulations du buffer  
  42.        std::vector<std::string::size_type> Positions;
  43.        for (std::string::size_type Pos = Buffer.find("E14D" ); Pos != std::string::npos; Pos = Buffer.find("E14D", Pos + 1))
  44.        {
  45.        Positions.push_back(Pos);
  46.        }
  47.        
  48. cout << Positions.front();
  49.              
  50.         // fermeture fichier  
  51.         fichier.close();       
  52.        
  53. system("PAUSE" );
  54. }


 
toute critique est bonne à prendre, n'hésitez pas ;)
 
par contre j'ai encore un gros problème, au niveau du vector, celui ci semble vide... La condition dans le if est elle mauvaise ? mon fichier est à présent binaire, la séquence E14D n'est pas telle quelle dans le fichier, elle apparait en correspondance ASCII, c'est à dire les deux caractères : áM.  
 
Dois je faire une recherche des deux caractères ?
 
[EDIT] il semble avant tout que le buffer ne contienne rien ... comment le vérifier simplement ? faut il faire une boucle pour bufferiser tout le contenu du fichier ?


Message édité par Thordax le 14-03-2006 à 11:03:25
n°1324935
franceso
Posté le 14-03-2006 à 11:50:55  profilanswer
 

il y a encore quelques problèmes :
 
ta fonction is_readable ne sert à rien : tu peux détecter les problèmes dès l'ouverture de ton fichier. C'est d'ailleurs ce que tu fais dans is_readable, avec une nouvelle ouverture de ton fichier dans un flux local à la fonction qui ne te servira pas par la suite.
 
si tu ouvres ton fichier en binaire, ça veut dire que tu le considères comme un flux d'octets. Ce que tu va donc chercher dedans n'est pas la suite de caractères "E14D" (ce qui n'a d'ailleurs pas de sens : pourquoi "E14D" plutôt que "e14d" par exemple) mais la paire d'octets dont la représentation hexa est e14d (à savoir 11100001 01001101, qui correspondrait effectivement à "áM" si tu l'interprétais comme une paire de caractères en ISO-8859-1)
 
Pour la lecture de ton fichier, ton histoire me paraît bien compliquée... mais je ne suis pas assez expert en matière de flux C++ pour te dire ce qui ne va pas...

mood
Publicité
Posté le 14-03-2006 à 11:50:55  profilanswer
 

n°1325138
Thordax
Shop smart. Shop S-Mart !
Posté le 14-03-2006 à 15:11:58  profilanswer
 

effectivement, la fonction  is_readable est inutile.
 
Lorsque j'ouvre le fichier binaire et que je fais une recherche de la séquence de la manière suivante (commande find de la classe string) :
 

Code :
  1. for (std::string::size_type Pos = buffer.str().find('1110000101001101',0); Pos != std::string::npos; Pos = buffer.str().find('1110000101001101', Pos + 1))
  2.               {//trame  trouvee
  3.                 cout << "Found E14D at " << Pos << endl;
  4.                }


 
le fichier ne recherche pas E14D mais la valeur "1" en dans le fichier (en caractère, et non en binaire. Si j'effecture une recherche de áM, cela fonctionne.
 
Cela dit, j'aurai besoin de scanner des trames qui n'ont pas de correspondance de type ASCII (exemple : 1EB2). Comment faire ? Merci :d

n°1325151
Thordax
Shop smart. Shop S-Mart !
Posté le 14-03-2006 à 15:25:54  profilanswer
 

corrigé, j'ai créé un E14D de la manière suivante :
 
char E14D[]={0xE1, 0x4D};
et j'ai fait un find sur le contenu du tableau E14D (find(*E14D,0))

n°1325152
franceso
Posté le 14-03-2006 à 15:30:22  profilanswer
 

Citation :

Lorsque j'ouvre le fichier binaire et que je fais une recherche de la séquence de la manière suivante (commande find de la classe string) :

Code :
  1. for (std::string::size_type Pos = buffer.str().find('1110000101001101',0); Pos != std::string::npos; Pos = buffer.str().find('1110000101001101', Pos + 1))
  2.               {//trame  trouvee
  3.                 cout << "Found E14D at " << Pos << endl;
  4.                }


je ne t'ai pas dit de chercher la chaine de caractères "1110000101001101", mais la suite de deux octets dont la représentation binaire est 11100001 01001101
 

Citation :

Cela dit, j'aurai besoin de scanner des trames qui n'ont pas de correspondance de type ASCII (exemple : 1EB2). Comment faire ? Merci :d

c'est justement pour cela qu'il ne faut pas que tu recherches des caractères dans une chaîne, mais plutôt des octets dans un flot.
Et je t'ai déjà dit que tu ne peux pas parler de code ASCII ici puisqu'il s'agit d'octets pleins alors que la table ASCII ne couvre que des codes sur 7 bits.
 
Ceci dit, si tu veux continuer à considérer ton flux comme une chaîne de caractères, tu peux sûrement utiliser la méthode find() pour rechercher les occurences d'une sous-chaîne constituée des deux caractères 30 et 178.
Mais à un moment ou à un autre, une solution hybride comme celle là risque de te causer des problèmes. Il vaudrait mieux que tu adoptes un seul formalisme (chaîne de caractères ou flot binaire) et que tu t'y tiennes

n°1325153
franceso
Posté le 14-03-2006 à 15:32:06  profilanswer
 

t'as posté avant moi...
visiblement je tappe pas assez vite :cry:

n°1325157
skelter
Posté le 14-03-2006 à 15:38:36  profilanswer
 

Thordax a écrit :

corrigé, j'ai créé un E14D de la manière suivante :
 
char E14D[]={0xE1, 0x4D};
et j'ai fait un find sur le contenu du tableau E14D (find(*E14D,0))


 
E14D est un tableau de char, c'est donc une adresse typée char, l'expression *E14D est de type char et retourne en l'occurence le premier element du tableau E14D
un simple find(E14D) suffit, ca correspond à l'appel de
size_type find(const charT* s, size_type pos = 0) const  

n°1325215
Thordax
Shop smart. Shop S-Mart !
Posté le 14-03-2006 à 16:42:20  profilanswer
 

ok, ca marche.  
 
Maintenant je cherche à faire une analyse des trois octets suivants. Pour cela, je fais la commande :
 
string trois_octets=buffer.str().substr(tag_E14D+2,3);
 
Je souhaite ensuite comparer cette string avec une trame hexa de type "00 00 00". Dois je déclarer un char[] ou un const char trame_nulle[]={0x00 , 0x00 ,0x00} et faire un simple  
 
if(trois_octets==trame_nulle) ?
 
J'imagine qu'on ne peut pas pas simplement comparer un tableau de char avec une string. De même, il est déconseillé d'utiliser les tableaux de char. Dois je faire une conversion du tableau de char {0x00 , 0x00 ,0x00} en une string correspondante ? ou dois-je déclarer une string directement ? (j'ai essayé la derniere option, std::string=000; mais évidemment "000000" n'est pas un char...


Message édité par Thordax le 14-03-2006 à 16:42:58
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[VB Word] Copier une page vers un nouveau documentLien vers image
[Shell] Insertion de caractèresxmlrpclib et caractères carriagereturn (\r)
comment retourner les 4 premiers caracteres d'une chaine ?[Java/Jdom] Copie d'un element vers un nouveau document
Exporter Table SQL avec ID vers .txt ou autrede java vers c++
Transférer données (manuscrites) vers BDD puis les additionner 
Plus de sujets relatifs à : Convertir Chaine de caractères vers hexa


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