[c++] Convertion char en hexadecimal

Convertion char en hexadecimal [c++] - C++ - Programmation

Marsh Posté le 28-01-2005 à 23:54:28    

Bonjour tout le monde.
Je recupere des données dans un buffer : char *buffer[255]
et j'aimerais le convertir en hexadecimal et l'afficher dans la console.
J'ai chercher un peu de partout mais je n'ai pas trouvé grand chose de concluant.
 
S'il vous plait un petit peu d'aide. Bonne soiré à tous et a toutes.

Reply

Marsh Posté le 28-01-2005 à 23:54:28   

Reply

Marsh Posté le 29-01-2005 à 00:44:45    

std::cout << std::hex << static_cast<int>('a')

Reply

Marsh Posté le 29-01-2005 à 11:08:36    

Merci de ta reponse mais je bloque.
si je met  
char *buffer = "test";
std::cout << std::hex << static_cast<char*>(buffer);
il me retourne le buffer en ASCII et non en hexa.
 
Merci encore pour ton aide. Si quelqu'un pouvait encore un peu m'aider ca serai sympa.

Reply

Marsh Posté le 29-01-2005 à 11:44:48    

char *buffer = "test"; ... manque un const
 
tatic_cast<char*>(buffer) tu peux nous expliquer ce que tu fais là ...
 
 
toutes façons, il faut que tu fasses un affichage pour chaque caractère

Reply

Marsh Posté le 29-01-2005 à 18:04:07    

comment faire alors a partir d'un char * pour afficher sa valeur hexa?
S'il te plait aide moi une fois de plus.
 
Merci pour ton aide deja et bonne fin d'aprem.


Message édité par tocx le 29-01-2005 à 18:04:27
Reply

Marsh Posté le 29-01-2005 à 18:23:41    

std::cout << static_cast<void*>(buffer);

Reply

Marsh Posté le 29-01-2005 à 23:29:22    

Tu veux afficher la valeur hexa du pointeur ou du contenu ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 30-01-2005 à 16:26:57    

bonjour HelloWorld  
je veux afficher la valeur hexa du contenu

Reply

Marsh Posté le 30-01-2005 à 16:43:05    

ben c'est quand tu veux pour te sortir les doigts. T'as le code pour afficher un char en hexa d'un côté, et ton char* de l'autre ... nous demande pas de t'écrire la boucle. Ça fait 2 jours que t'es dessus, on peut pas dire que tu fasses preuve de volonté.

Reply

Marsh Posté le 30-01-2005 à 16:46:32    

lol
Je ne fais pas que ca je me suis pas penché sur le probleme depuis que tu mais filé le
std::cout << std::hex << static_cast<int>('a')
Je code le reste du soft a coté. Je n'ai fait que répondre a sa question. Je n'ai en aucun cas demandé a ce que l'on me code la boucle.
 
Enfin merci de votre aide.

Reply

Marsh Posté le 30-01-2005 à 16:46:32   

Reply

Marsh Posté le 30-01-2005 à 16:47:43    

tocx a écrit :


Je code le reste du soft a coté.

mais est-ce que tu l'as écrite cette boucle ?

Reply

Marsh Posté le 30-01-2005 à 16:56:03    

Je suis en train j'ai besoin de la fonction que maintenant

Reply

Marsh Posté le 31-01-2005 à 15:13:05    

bonjour j'ai encore besoin d'un petit coup de main.
Voila ma fonction :
 

Code :
  1. char GetPacketHexa(char *packet, char *hexa)
  2. {
  3.     const char *fichier = "temp.dat";
  4.     ofstream fout(fichier);
  5.    
  6.     int len = strlen(packet);
  7.     printf("Taille du packet: %d\n", len);
  8.    
  9.     while(len >= 1)
  10.     {
  11.         printf("Len: %d\n", len);
  12.         printf("Packet: %s\n", packet++);
  13.         fout << std::hex << static_cast<int>(*packet);
  14.         fout << " ";
  15.        
  16.         packet = strpbrk(packet, "abcdefghijklmnopqrstuvwxyz " );
  17.         len = len--;
  18.     }
  19.    
  20.     return *hexa;
  21. }


 
maintenant mon probleme vien du strpbrk. En fait je voudrai enlever le premier caractere de la chaine a chanque fois. Malheuresement il n'y a pas que abcde... 1234567890 espace et autre. Il est possible que dans mon char* j'ai tout les caractere mais je ne peu pas tous les passer en argument de strpbrk.
Vous n'ouriez pas une solution a me proposer s'il vous plait?

Reply

Marsh Posté le 31-01-2005 à 15:36:22    

Aie ! Il y en a qui risque de ne pas aimer que tu mélanges le C et le C++ mais autrement pourquoi tu fais pas ++packet; tout simplement (tu le fais en plus déjà dans le printf) ?
 
Et ca c'est quoi : len = len--; ?
Tu voulais pas plutot faire len++; ?
 
Bon je passe le reste mais je pense que tu devrais commencer par revoir les bases.


Message édité par Tarabiscote le 31-01-2005 à 15:44:21
Reply

Marsh Posté le 31-01-2005 à 15:43:35    

non non len-- du o while( len >= 1)
il faut bien diminuer len
et je comprend pas ton packet++
peut tu mexpliquer s'il te plait

Reply

Marsh Posté le 31-01-2005 à 15:52:30    

Ben oui pour diminuer len on fait généralement len--; ou len -= 1; ou encore len = len - 1; mais pas len = len--;
 
Autrement packet++ permet de passer au caractere suivant (si c'est bien ce que tu veux faire).
 
Mais tu le fais déjà dans le printf (ligne 12) autrement dit tu es déjà au 2eme caractere lorsque  tu fais :
fout << std::hex << static_cast<int>(*packet);
 
Sinon tu devrais remplacer tes printf par des cout, par exemple :
cout << "Len: " << len << endl;

Reply

Marsh Posté le 31-01-2005 à 16:08:00    

merci  
sinon autre question la je lui fait ecrir dans un fichier.
comment lui faire ecrir mon std::hex dans une string?

Reply

Marsh Posté le 31-01-2005 à 16:59:46    

Hum je pense qu'il faut faire en deux fois :
// en premier dans un ostringstream
ostringstream temp;
temp << hex << static_cast<int>('a');
// et ensuite dans la string
string toto = temp.str();

Reply

Marsh Posté le 31-01-2005 à 17:40:45    

merci pour ta reponse mais j'ai une erreur
le code:
 

Code :
  1. char GetPacketHexa(char *packet)
  2. {
  3.     char *hexa;
  4.     const char *fichier = "temp.dat";
  5.     ofstream fout(fichier);
  6.     ostringstream temp;
  7.    
  8.     int len = strlen(packet);
  9.     printf("Taille du packet: %d\n", len);
  10.    
  11.     while(len >= 1)
  12.     {
  13.         printf("Len: %d\n", len);
  14.         printf("Packet: %s\n", packet++);
  15.         fout << std::hex << static_cast<int>(*packet);
  16.         temp << std::hex << static_cast<int>(*packet);
  17.         fout << " ";
  18.        
  19.         len--;
  20.        
  21.         hexa = temp.str();
  22.     }
  23.    
  24.     return *hexa;
  25. }


 
voila et mon erreur :
aggregate `std::ostringstream temp' has incomplete type  and cannot be defined
 
je ne la comprend pas.
merci encore pour ton aide.


Message édité par tocx le 31-01-2005 à 17:41:09
Reply

Marsh Posté le 31-01-2005 à 17:54:04    

as-tu inclu <sstream> ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 31-01-2005 à 18:07:45    

J'ai peut etre oublié de préciser qu'il fallait rajouter :
#include <sstream>
 
Mais c'est pour mettre dans un string et pas un char* (ce que je te conseil d'ailleur)
 
Autrement si tu veux vraiment un char* faut mettre :
    size_t longueur = temp.str().size() + 1;
    hexa = new char[longueur];
    strncpy(hexa, temp.str().c_str(), longueur);
à la place de :
    hexa = temp.str();

Reply

Marsh Posté le 01-02-2005 à 07:11:40    

Merci ca marche comme sur des roulettes.
Si je peu abuser encore une fois maintenant je cherche a faire une convertion d'une chaine hexa pas exemple
char *hexa = "01 01 04 02 02 04 05 B4";
vers un char *send;
comment faire?
Merci encore Tarabiscote de ton aide.

Reply

Marsh Posté le 01-02-2005 à 09:51:45    

C'est le même principe, fait avec istringstream et >> cette fois-ci.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 01-02-2005 à 19:09:17    

merci de votre aide mais ce que j'ai fait n'a pas l'air correct
 

Code :
  1. char *GetAscii(char *packet, char *hexa)
  2. {
  3.     int len = strlen(packet);
  4.     printf("Taille du packet: %d\n", len);
  5.    
  6.     istringstream temp;
  7.    
  8.     while(len >= 1)
  9.     {
  10.         printf("Len: %d\n", len);
  11.         printf("Packet: %s\n", packet++);
  12.         temp >> std::hex >> static_cast<int>(*packet);
  13.        
  14.         len--;
  15.     }
  16.    
  17.     cout << temp << endl;
  18.    
  19.     return hexa;
  20. }


 
avec comme string char *packet = "61";
il m'affiche, lors du cout << temp << endl;, "0".
Je pense que je fait erreur quelque part mais je ne sais pas ou.
 
En tout cas merci de votre aide.

Reply

Marsh Posté le 02-02-2005 à 01:17:28    

Ah oui y'a plusieurs pblm. Deja apprends à utiliser std::string et oublie strlen et les char * pour les chaines de caractère. Ensuite faut initialiser ton istringstream avec la chaine sous forme hexa. Puis extraire des char avec l'opérateur >> tant que ça marche. Chaque caractère extrait tu l'ajoutes à la chaine à renvoyer.

Code :
  1. std::string GetAscii( const std::string & HexaString )
  2. {
  3.     istringstream iss( HexaString );
  4.     std::string result;
  5.     char c;
  6.     while ( iss >> std::hex >> c )
  7.     {
  8.         result.push_back( c );
  9.     }
  10.     return result;
  11. }


Y'en a un qui va gueuler mais tant pis, lis cette FAQ le sujet sur les string devrait t'éclairer.
http://c.developpez.com/faq/cpp/?page=strings
Pour pas faire passer ça pour de la pub, d'autres FAQ à consulter:
http://www.cmla.ens-cachan.fr/Util [...] s/C++/FAQ/
http://www.parashift.com/c++-faq-lite/


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-02-2005 à 13:59:58    

Désolé de pas avoir pu répondre hier.
 
Sinon je suis d'accord avec HelloWorld si ce n'est que je mettrai plutot short c; à la place de char c; (sinon il risque de prendre chiffre par chiffre à la place de prendre les 2 chiffres hexa)
 
De plus les chiffres doivent etre séparé par un espace (avec ce bout de code) ce qui n'est pas le cas de la fonction précédente (si c'est fait pour aller avec)

Reply

Marsh Posté le 02-02-2005 à 22:47:31    

Moi je suis parti de ça:

Citation :

char *hexa = "01 01 04 02 02 04 05 B4";  


Par contre j'ai testé c'est vrai qu'il prend char par char, le std::hex ne change rien. Donc mettre short ou int pour le forcer a bien prendre chaque groupe de chiffres :jap:.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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