Votre question

Inversion de code[C++]

Tags :
  • Programme
  • C++
  • Programmation
Dernière réponse : dans Programmation
6 Novembre 2011 21:22:45

Bonjour à tous,

Je voudrais savoir comment inverser se code :

  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. string str;
  9. cin >> str;
  10. cout << hex;
  11. for (int i = 0; i < str.size(); i++)
  12. cout << (int)str[i];
  13. cout << endl;
  14. return 0;
  15. }


Merci d'avance

Nir3x [:nir3x]

Autres pages sur : inversion code

a c 232 L Programmation
6 Novembre 2011 21:42:12

Salut,

Qu'est ce que tu veux dire par inverser ?
6 Novembre 2011 22:25:16

Faire l'inverse :

Là, le programme converti des lettres en hexadécimale,
je voudrais qu'il redonne des lettres quand on rentre de l'hexadécimale.

Nir3x [:nir3x]
Contenus similaires
a c 232 L Programmation
7 Novembre 2011 09:09:20

Tu peux pas caster chaque partie en char ? :p 
7 Novembre 2011 12:37:53

Comment ?:pt1cable: 
a c 232 L Programmation
7 Novembre 2011 13:43:38

Bah tu fais une boucle sur toutes tes valeurs hexa, et tu fais un cast en char.
Mais je sais pas si ça se fait...
a b L Programmation
7 Novembre 2011 20:19:22

Codage ASCII de '0' à '9': de 0x30 à 0x39, donc pour les chiffres, il suffit de faire Caractère - 0x30
Pour les codages de 'A' à 'F' : de 0x41 à 0x46, donc pour les lettres, il suffit de faire Caractère - 0x37
Tu peux aussi gérer les minuscules.

Ensuite, tu prends tous les 2 caractères pour calculer n = (conversion(c1) << 4) + conversion(c2) et tu as le codage ASCII.

Tu peux t'en sortir en faisant ta propre classe et en utilisant les flux, pour faire une désérialisation.
8 Novembre 2011 23:03:46

Oula, je suis perdu, vous savez je ne suis que petit programmeur (Si je peux me désigner ainsi :-)) pour mes besoins personnels.

Spell me please ;-)
9 Novembre 2011 16:39:54

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. printf("%x$\n", 12);
  6. return (0);
  7. }

Affichera 'C$'.
Sinon c'est juste une conversion base à base.
Cet algo permet d'afficher un nombre en n'importe quelle base, même fantaisiste.
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int my_strlen(const char *c)
  5. {
  6. int i;
  7.  
  8. i = -1;
  9. while (c && c[++i]);
  10. return (i);
  11. }
  12.  
  13. void put_nbr_base(int nbr, const char *base)
  14. {
  15. int numeric_base;
  16. if (nbr < 0)
  17. {
  18. printf("-");
  19. nbr = -nbr;
  20. }
  21. numeric_base = my_strlen(base);
  22. if (nbr >= numeric_base)
  23. put_nbr_base(nbr / numeric_base, base);
  24. printf("%c", base[nbr % numeric_base]);
  25. }
  26.  
  27. int main(int ac, char **av)
  28. {
  29. if (!(av[1]))
  30. {
  31. printf("Enter a number\n");
  32. return (1);
  33. }
  34. put_nbr_base(atoi(av[1]), "0123456789abcdef");
  35. printf("\n");
  36. return (0);
  37. }
a b L Programmation
9 Novembre 2011 20:10:14

En fait, il cherche la conversion d'une chaine écrite en hexa vers le caractère ou le nombre (si j'ai bien compris).
On peut aussi utiliser une technique avec un tableau, mais dans l'autre sens, il faut faire une recherche dans ce tableau, alors je trouve plus simple la conversion directe du codage ASCII vers le chiffre.

Pour ce que je disais, un caractère est codé sur un octet de 0x00 à 0xFF, donc si tu as "AB", tu dois décoder chaque caractère pour avoir valeur("A" )=10 et valeur("B" )=11, sachant que le codage ASCII de "A" est 0x41 (en C ou C++, le type char est en fait un nombre de 0 à 255), donc valeur("A" ) = 'A' - 0x41 + 0x0A = 0x0A
Ensuite, 1 caractère hexa est codé sur 4 bits, donc soit tu fais valeur("A" ) * 16 (la dizaine en base 16), soit tu fais un décalage de 4 bits à gauche.

Je ne vais pas t'apporter la solution, mais je peux t'aider si tu le fais.

Bon, j'apporte juste la solution en python parce que c'est rapide :D  :
str='414a4B'
l=[str[i:i+2] for i in range(0,len(str),2)]
''.join([chr(int(c,16)) for c in l])

9 Novembre 2011 20:56:18

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int my_strlen(const char *c)
  5. {
  6. int i;
  7.  
  8. i = -1;
  9. while (c && c[++i]);
  10. return (i);
  11. }
  12.  
  13. void put_nbr_base(int nbr, const char *base)
  14. {
  15. int numeric_base;
  16. if (nbr < 0)
  17. {
  18. printf("-");
  19. nbr = -nbr;
  20. }
  21. numeric_base = my_strlen(base);
  22. if (nbr >= numeric_base)
  23. put_nbr_base(nbr / numeric_base, base);
  24. printf("%c", base[nbr % numeric_base]);
  25. }
  26.  
  27. int main(int ac, char **av)
  28. {
  29. if (!(av[1]))
  30. {
  31. printf("Enter a number\n");
  32. return (1);
  33. }
  34. put_nbr_base(atoi(av[1]), "0123456789abcdef");
  35. printf("\n");
  36. return (0);
  37. }


Ce code ne fonctionne pas chez moi :'( 
9 Novembre 2011 23:04:03

Super, mais encore? ^^'
Ça compile pas? Ça compile mais ça marche pas?
9 Novembre 2011 23:27:24

Il compile pas sur CodeBlocks et il compile et se lance sur Devc++ mais la fenêtre disparait immédiatement.

[:nir3x]
11 Novembre 2011 08:34:45

Il faut exécuter le programme dans un shell et entrer
$./programme nombre
11 Novembre 2011 13:08:08

Comment ? un shell, VB ?
a b L Programmation
11 Novembre 2011 17:48:06

oui le programme se termine très rapidement.

Si tu es sous windows, tu peux ajouter ceci avant les return: system("pause");
11 Novembre 2011 20:37:36

J'ai essayé la pause, Celle-ci ne fonctionne pas.
a b L Programmation
12 Novembre 2011 17:26:56

son programme prend aussi un paramètre à l'exécution du programme. J'imagine que tu n'as pas mis de pause avec le premier return.
13 Novembre 2011 17:58:42

J'ai mis une pause au dernier return
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS