Partage
  • Partager sur Facebook
  • Partager sur Twitter

Convertions

Sujet résolu
    12 juin 2006 à 22:23:08

    Je rencontre un problème que je n'arrive pas à résoudre : comment convertir un char en long ??

    Je m'explique : l'utilisateur rentre un texte qui sera stocké dans une variable de type char. Je veux ensuite pouvoir transformer les lettres que l'utilisateur a entré en nombre (table ASCII).

    Par exemple : l'utilisateur rentre le mot POPOL. Je veux avoir une variable qui contiendra le code ASCII (080079080079076 si je ne me trompe pas).

    Inversement j'aimerai aussi pouvoir à partir de 080079080079076 reconstituer le mot POPOL.

    Mon objectif : pouvoir transformer du texte en nombre de manière à pouvoir faire des calculs dessus (genre de cryptage) et inversement (décryptage).
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2006 à 9:01:33

      Salut
      Tu crées un tableau de long de la même taille que ta chaîne et tu fais cette opération:
      for(i = 0; chaine[i] != '\0'; i++)
      {
         tableauLong[i] = (long)chaine[i];
      }
      • Partager sur Facebook
      • Partager sur Twitter
        13 juin 2006 à 9:04:14

        Tu veux un tableau de valeurs numériques (alors tu l'as déja, pas besoin de faire grand chose), ou une seule valeur qui fait la somme de tous les machins (dans ce cas là tu va dépasser la limite des long bien vite à mon avis) ?
        • Partager sur Facebook
        • Partager sur Twitter
          13 juin 2006 à 9:22:30

          Bah en fait je galère là dessus depuis pas mal de temps. :(
          Comme je l'ai dis je voudrais pouvoir transformer une saisie de l'utilisateur en un nombre pour pouvoir le crypter (et inversement).

          Le problème c'est que dès que je pense avoir trouver une solution, ça marche pas...
          • Partager sur Facebook
          • Partager sur Twitter
            13 juin 2006 à 9:31:40

            pourquoi tu ne transposes pas chaque lettre par un chiffre??
            si tu ne fait que les lettres tu auras 25 chiffres different ( on commence par zero ) puis apres tu peut aussi coder l'espace ( " " ) , les lettres tels que "£,ù,..." .

            apres pour coder les chiffres tu utilises le cryptage par reste , ce qui est tres facile grace au modulo. ( si tu connais pas cette methode dis le je t'expliquerai )

            puis apres t'a aussi un moyen facil de le décrypter enfin facile pour toi mais pas pour ce qui connaisse pas la clef de décryptage ! d'où l'interet :)

            bon y a plus performant comme cryptage c'est sur, comme par exemple le cryptage exponnentiel ( avec des puissances ) qui est juste un peu plus dur à décrypter , apres je presume que ce n'est pas ce qu'utilise la NASA mais bon .. :lol:

            Mais ca n'utilise pas le code ASCII donc c'est un moyen de coder les lettres mais pas avec ASCII si c'est abslomument ce que tu veux utiliser

            PS : d'ailleur on l'aprend en cours de maths spé en Terminale S :)
            • Partager sur Facebook
            • Partager sur Twitter
              13 juin 2006 à 9:49:18

              Donc en gros c'est à moi de trouver un code pour TOUS les boutons de mon clavier ??
              Dans ce cas là je dois convertir le code ASCII de chaque lettre dans mon code ?? (j'ai beaucoup de mal avec les variables char, même si le cour pour les ZérOs m'a un peu aidé de ce côté là)

              Citation : C@rn@GE59

              apres pour coder les chiffres tu utilises le cryptage par reste , ce qui est tres facile grace au modulo. ( si tu connais pas cette methode dis le je t'expliquerai )



              ==> Je ne connais pas cette méthode :euh:
              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2006 à 9:51:31

                Citation : Thedownloader

                Bah en fait je galère là dessus depuis pas mal de temps. :(
                Comme je l'ai dis je voudrais pouvoir transformer une saisie de l'utilisateur en un nombre pour pouvoir le crypter (et inversement).

                Le problème c'est que dès que je pense avoir trouver une solution, ça marche pas...


                Je ne suis pas sûr que ce soit une bonne idée. Une chaine de caractère est une séquence de bytes d'une longueur arbitraire.

                Un cryptage byte par byte avec une clé est généralement suffisant.

                Tu peux ramener la chaine à des blocs de 32 bits (unsigned long) voire de 64 bits ([C99]unsigned long long), mais ça reste limité. Pour des tailles plus importantes, il faut utiliser, par exemple, la bibliothèque GMP qui permet de faire de l'arithmétique entière sur des nombes d'une largeur illimitée.

                D'autre part, la cryptologie est une science à part entière. Il existe de nombreux sites traitant du sujet.
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  13 juin 2006 à 10:31:04

                  Citation : -ed-

                  Tu peux ramener la chaine à des blocs de 32 bits (unsigned long) voire de 64 bits ([C99]unsigned long long), mais ça reste limité.



                  C'est justement là où j'ai du mal : convertir du texte en nombres.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juin 2006 à 10:34:02

                    On est en train de te dire que ça marchera pas. Si avec un texte tu veux faire un seul nombre, soit tu fais une conversion avec perte d'informations, soit au dessus de quelques lettres ça marchera plus.

                    Tu ferais mieux de convertir chaque lettre en nombre (en fait, t'as rien à faire, ils sont déja stockés comme des nombres en mémoire) et d'agir sur le tableau.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juin 2006 à 10:45:39

                      Désolé j'avais mal compris.

                      Donc ce code là devrais marcher :
                      #include <cstdlib>
                      #include <iostream>
                      #include <stdio.h>
                      #include <fstream>
                      #include <string.h>

                      using namespace std;

                      int main(int argc, char *argv[])
                      {
                          long a, nb, ic, i=0;
                          char b[1024];
                         
                          //On stocke la saisie de l'utilisateur dans le tableau b
                          ic=getchar();
                          while (ic != '\n') {
                          b[i]=ic;
                          i++;
                          ic=getchar();
                          }
                          b[i]='\0';
                         
                          nb = strlen(b); // On compte le nombre de cases utilisées sur les 1024
                         
                          i=0;
                          while(i <= nb) // On modifie le contenu de ce tableau en ajoutant 1 à chaque valeur
                          {
                                  b[i] = b[i] + 1;
                                  i++;
                          }

                          // Et là normalement, si l'utilisateur à entré "abcd" on doit avoir "bcde"
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juin 2006 à 11:00:10


                         int main(int argc, char *argv[])
                         {
                             long i, len;
                             char b[1024];
                             
                             for(i = 0; (i == 0 || b[i-1] != '\n'); ++i)
                                 b[i] = getchar();
                             len = i;
                             b[len] = '\0';

                             for(i = 0; i < len; ++i)
                                b[i] += 1;
                         }


                        Ceci dit, il y a moyen de coder plus simplement ce genre de trucs :
                        int main(void)
                        {
                            char c;
                            while ((c = getchar()) != '\n')
                               putchar(c+1);
                            }
                            puts('\n');
                            return 0;
                        }

                        (j'ai testé aucun des codes, c'est pour donner une idée)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 juin 2006 à 11:19:50

                          Merci beaucoup ça me débloque énormément :)

                          Mon code :
                          int main(int argc, char *argv[])
                          {
                               long i, len;
                               char b[1024];
                               
                               for(i = 0; (i == 0 || b[i-1] != '\n'); ++i) //Saisie
                                   b[i] = getchar();
                               len = i;
                               b[len] = '\0';

                               for(i=0; i < len; ++i) // On ajoute 1 à toutes les lettres
                                  b[i] += 1;
                                 
                               for(i=0; i < len-1; ++i) // On affiche
                                  cout << b[i];
                             
                               cout << endl; // Saut à la ligne
                             
                               for(i=0; i < len; ++i) // On enlève 1 à toutes les lettres
                                  b[i] -= 1;
                                 
                               for(i=0; i < len-1; ++i) // On affiche
                                  cout << b[i];
                          }


                          Le résultat :
                          Je m'appelle Popol, et j'ai 500$
                          kf!n(bqqfmmf!Qpqpm-!fu!k(bj!611%
                          Je m'appelle Popol, et j'ai 500$
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 juin 2006 à 11:22:53

                            Par contre, fais gaffe, en C t'as aucune assurance que ajouter 1 à la valeur numérique, ça donne la lettre au dessus.
                            C'est comme ça en pratique, mais sur un autre PC ce sera pas forcément le cas.

                            Donc ne fais pas trop confiance à ce genre de manips.

                            Cependant, comme toi tu veux juste avoir "autre chose", c'est pas grave que 'a'+1 ne donne pas 'b' mais 'c' (par exemple), puisque les même conventions seront suivies pour le décryptage, et donc tu retrouveras le message originel.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 juin 2006 à 11:35:33

                              J'en ai à peine fini avec un problème que j'en rencontre un autre :o

                              Comme l'opération de cryptage (ci-dessus) aura besoin d'être répétée plusieurs fois, j'ai donc (essayé) de faire une fonction qui prend comme paramètre la variable du texte à crypter et la longueur de ce texte (nécéssaire à la boucle).

                              J'ai donc :

                              main.cpp
                              #include <cstdlib>
                              #include <iostream>
                              #include <stdio.h>
                              #include <fstream>
                              #include <string.h>
                              #include "cryptage.h" // Le header du fichier qui contient la fonction de cryptage

                              using namespace std;

                              int main(int argc, char *argv[])
                              {
                                   long i, len;
                                   char txt[1024], b[1024];
                                   
                                   for(i = 0; (i == 0 || b[i-1] != '\n'); ++i) // Saisie
                                       b[i] = getchar();
                                   len = i;
                                   b[len] = '\0';
                                   
                                   crypt(b, len); // Appel de la fonction
                                     
                                   for(i=0; i < len-1; ++i) // Affichage
                                      cout << txt[i];
                                 
                                  int popol; // Pour avoir le temps de lire ^^
                                  cin >> popol;
                              }


                              cryptage.h
                              #ifndef DEF_CRYPT
                              #define DEF_CRYPT

                              char crypt(char*, long);

                              #endif


                              cryptage.cpp
                              #include <cstdlib>
                              #include <iostream>
                              #include <stdio.h>
                              #include <fstream>
                              #include <string.h>

                              using namespace std;

                              char crypt(char txt, long len)
                              {
                                   long i;
                                   char txt_crypt[1024];
                                   
                                   for(i=0; i < len; ++i)
                                   txt_crypt[i] = txt[i] + 1;
                              }


                              Et... ça marche pas :(
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 juin 2006 à 11:38:14

                                Bah dans ta fonction, tu modifies txt_crypt, mais tu renvoies rien.
                                Comment le main peut-il savoir quelles modifs tu as effectuées ?
                                À mon avis ce serait plus simple de modifier txt en place.

                                Par ailleurs :
                                char crypt(char*, long);
                                // [...]
                                char crypt(char txt, long len)

                                T'as oublié un truc là ;)

                                Enfin, la variable txt que tu affiches dans ton main n'a jamais été modifiée. Donc forcément elle affichera pas ce que tu veux.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 juin 2006 à 11:38:46

                                  Citation : Thedownloader

                                  cryptage.h

                                  #ifndef DEF_CRYPT
                                  #define DEF_CRYPT

                                  char crypt(char*, long);

                                  #endif



                                  cryptage.cpp

                                  char crypt(char txt, long len)



                                  ça marche pas :(


                                  1 - il faut aussi inclure le .h dans le fichier de définition
                                  2 - le prototype séparé et celui de la fonction doivent être cohérents.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !
                                    13 juin 2006 à 11:49:38

                                    1- Tu veux dire que je dois mettre
                                    #include "cryptage.h"
                                    dans cryptage.cpp ??

                                    2- Tu veux dire que j'ai pas mis de * ?


                                    J'ai fais des modifs et ça donne :

                                    main.cpp
                                    #include <fstream>
                                    #include <string.h>
                                    #include "cryptage.h"

                                    using namespace std;

                                    int main(int argc, char *argv[])
                                    {

                                         long i, len;
                                         char txt[1024], b[1024];
                                         
                                         for(i = 0; (i == 0 || b[i-1] != '\n'); ++i)
                                             b[i] = getchar();
                                         len = i;
                                         b[len] = '\0';
                                         
                                         crypt(b, len);
                                           
                                         for(i=0; i < len-1; ++i)
                                            cout << txt[i];
                                           
                                         cout << endl;

                                        decrypt(txt, len);
                                       
                                        for(i=0; i < len-1; ++i)
                                            cout << txt[i];
                                       
                                        int popol;
                                        cin >> popol;
                                    }


                                    cryptage.h
                                    #ifndef DEF_CRYPT
                                    #define DEF_CRYPT

                                    char crypt(char*, long);
                                    char decrypt(char*, long);

                                    #endif


                                    cryptage.cpp
                                    #include <cstdlib>
                                    #include <iostream>
                                    #include <stdio.h>
                                    #include <fstream>
                                    #include <string.h>

                                    using namespace std;

                                    char crypt(char *txt, long len)
                                    {
                                         long i;
                                         
                                         for(i=0; i < len; ++i)
                                         txt[i] += 1;
                                    }

                                    char decrypt(char *txt, long len)
                                    {
                                         long i;
                                         
                                         for(i=0; i < len; ++i)
                                         txt[i] -= 1;
                                    }


                                    Je n'obtient pas d'erreurs à la compilation mais le caractère décrypté ne correspond pas du tout au caractère crypté !
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      13 juin 2006 à 11:58:33

                                      Pourquoi t'utilises deux variables, b et txt ? Fait tout sur txt et puis voilà. Là tu lis dans b et tu cryptes dans txt o_O
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        13 juin 2006 à 12:04:17

                                        J'ai moi même du mal à répondre à cette question... :euh:

                                        Quand je remplace tous les b par des txt ça marche ! :)

                                        Mais du coup ça ne marchera pas si j'ai plusieurs appels de cette fonction et que la variable qui contient le texte à crypter ne s'appelle pas txt...
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          13 juin 2006 à 12:09:18

                                          À mon avis tu as un petit problème de cohérence. Tu manipules une variable, tu la modifie, et tu l'affiches, puis tu inverses les modificatins, et tu la ré-affiches.

                                          Ça ne pose pas de problème non ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            13 juin 2006 à 12:11:18

                                            Oui c'est le but du programme.

                                            Mais si je veux réutiliser cette fonction dans un autre programme, ma variable (qui contient le texte à crypter) sera-t-elle forcément appelée txt ?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              13 juin 2006 à 12:13:13

                                              Ben, non, tu changeras le nom de l'argument, c'est tout.

                                              Hum. J'ai l'impression que tu as quelques lacunes. Tu devrais relire le chapitre sur les fonctions.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                13 juin 2006 à 12:22:11

                                                Tu as raison je vais le re-relire ^^

                                                Merci beaucoup pour ton aide !
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  13 juin 2006 à 13:57:00

                                                  Citation : Thedownloader

                                                  1- Tu veux dire que je dois mettre

                                                  #include "cryptage.h"

                                                  dans cryptage.cpp ??

                                                  2- Tu veux dire que j'ai pas mis de * ?


                                                  Oui et oui.

                                                  Citation : Pas de titre


                                                  J'ai fais des modifs et ça donne :
                                                  <...>
                                                  Je n'obtient pas d'erreurs à la compilation


                                                  Alors tu ne dois pas compiler le bon code...

                                                  Project : C++
                                                  Compiler : GNU GCC Compiler (called directly)
                                                  Directory : D:\dev\cpp\
                                                  --------------------------------------------------------------------------------
                                                  Switching to target: default
                                                  Compiling: main.cpp
                                                  main.cpp: In function `int main(int, char**)':
                                                  main.cpp:22: error: `cout' undeclared (first use this function)
                                                  main.cpp:22: error: (Each undeclared identifier is reported only once for each function it appears in.)
                                                  main.cpp:32: error: `cin' undeclared (first use this function)
                                                  Process terminated with status 1 (0 minutes, 8 seconds)

                                                  Et même un fois main.cpp corrigé :

                                                  Project : C++
                                                  Compiler : GNU GCC Compiler (called directly)
                                                  Directory : D:\dev\cpp\
                                                  --------------------------------------------------------------------------------
                                                  Switching to target: default
                                                  Compiling: main.cpp
                                                  Compiling: cryptage.cpp
                                                  cryptage.cpp: In function `char crypt(char*, long int)':
                                                  cryptage.cpp:16: warning: control reaches end of non-void function
                                                  cryptage.cpp: In function `char decrypt(char*, long int)':
                                                  cryptage.cpp:24: warning: control reaches end of non-void function

                                                  J'ai refais ton code en C (Le C++, je ne connais pas)

                                                  /* main.c */
                                                  #include <stdio.h>
                                                  #include "cryptage.h"

                                                  int main()
                                                  {

                                                     long i = 0;
                                                     char b[1024];

                                                     while ((b[i] = getchar()) != '\n' && i < sizeof b - 1 )
                                                     {
                                                        ++i;
                                                     }
                                                     b[i] = '\0';
                                                     puts(b);

                                                     crypt(b);
                                                     puts(b);

                                                     decrypt(b);
                                                     puts(b);

                                                     return 0;
                                                  }

                                                  Avec

                                                  /* cryptage.h */
                                                  #ifndef DEF_CRYPT
                                                  #define DEF_CRYPT

                                                  void crypt(char*);
                                                  void decrypt(char*);

                                                  #endif

                                                  et

                                                  /* cryptage.c */
                                                  #include "cryptage.h"

                                                  void crypt(char *txt)
                                                  {
                                                     long i = 0;

                                                     while (txt[i] != 0)
                                                     {
                                                        txt[i]++;
                                                        i++;
                                                     }
                                                  }

                                                  void decrypt(char *txt)
                                                  {
                                                     long i = 0;

                                                     while (txt[i] != 0)
                                                     {
                                                        txt[i]--;
                                                        i++;
                                                     }
                                                  }

                                                  Et ça donne

                                                  Hello world
                                                  Hello world
                                                  Ifmmp!xpsme
                                                  Hello world

                                                  Press ENTER to continue.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Music only !
                                                    13 juin 2006 à 17:57:17

                                                    Je pense que tes erreurs de compilations sont dues au fait que moi j'ai mis ça :
                                                    #include <cstdlib>
                                                    #include <iostream>
                                                    #include <stdio.h>
                                                    #include <fstream>
                                                    #include <string.h>
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Convertions

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown