Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec Qt

je n'arrive pas à adapter la fonction XOR avec le reste de mon code

Sujet résolu
    8 août 2007 à 22:54:50

    Bonjour,

    Voila, je débute avec Qt et j'ai décidé de réalisé un crypteur utilisant la fonction XOR avec une interface pour débuter.

    Après plusieurs recherches dans la doc, j'ai réussi à me faire une interface toute bête sans trop de difficultées ^^

    Mais voila, mon problème est que je ne parvient pas à adapter la fonction XOR du tuto avec mon code source :'(

    Dans mon code, les pointeurs sur les deux fichiers sont de type QFile et la clef de cryptage de type QString.

    La fonction d'origine est la suivante :

    1. void ReadXorAndWrite(FILE *fin,FILE *fout,char key[30])
    2. {
    3.     /* On va déclarer trois variables :
    4.     - La première est celle qui va recevoir en mémoire
    5.     l'octet lu dans fin;
    6.     - La seconde est la variable qui contiendra en mémoire
    7.     le XOR de l'octet lu et l'octet de la clef;
    8.     - La troisième est une variable qui s'incrémentera
    9.     au fil du temps pour se déplacer dans key[] et qui
    10.     reviendra au début de la chaîne. */
    11.     char ch;
    12.     int xoring;
    13.     int i = 0;
    14.     /* On va ensuite faire une boucle infinie qui s'arrêtera en cas
    15.     d'échec de lecture de fin, donc si il n'y a plus rien à lire dans
    16.     fin */
    17.     while(1)
    18.     {
    19.         /* Si l'on arrive plus à lire dans fin pour
    20.         mémoriser en adresse mémoire de ch un élément qui correspond
    21.         à l'octet, on 'break' pour sortir de la boucle */
    22.         if(!fread(&ch,sizeof(char),1,fin))
    23.             break;
    24.         else
    25.         {
    26.             /* Sinon, on vérifie que nous ne sommes pas à la fin de la chaîne
    27.             de key, donc si l'octet actuel de key n'est pas '\0'. */
    28.             if(key[i] == '\0')
    29.             {
    30.                 /* On remet le compteur i à 0 pour revenir en début de chaîne */
    31.                 i = 0;
    32.             }
    33.             /* On affecte à 'xoring' le xor de l'octet de fin et celui de la clef
    34.             grâce à l'opérateur logique '^' */
    35.             xoring = ch ^ key[i];
    36.             /* Et enfin on écrit dans fout la valeur de xoring ! */
    37.             fwrite(&xoring,sizeof(char),1,fout);
    38.         }
    39.         /* On a fini la condition, on incrémente 'i' et on ferme la boucle */
    40.         i++;
    41.     }
    42. }


    Pourriez vous m'aider svp ?
    merci

    • Partager sur Facebook
    • Partager sur Twitter
      8 août 2007 à 23:06:41

      ça m'intéraisse aussi lol :)
      • Partager sur Facebook
      • Partager sur Twitter
      :)
        8 août 2007 à 23:08:27

        C'est que tu essai de faire un crypteur toi aussi ? :)
        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2007 à 23:09:40

          qu'est ce que tu as déjà fait ? c'est pas très compliqué à adapter.
          • Partager sur Facebook
          • Partager sur Twitter
            8 août 2007 à 23:12:47

            Avec Qt pour travailler avec des caractères, penses à QChar ;)
            Sinon montres ce que tu as déjà fait...
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              8 août 2007 à 23:13:44

              Regarde du côté des [i/o]stream. Tu trouveras tout seul, j'en suis sûr. ;)

              EDIT : pas retenu que tu utilisait Qt.
              • Partager sur Facebook
              • Partager sur Twitter
                9 août 2007 à 13:34:53

                Voici le code :

                main.cpp :
                1. #include <QApplication>
                2. #include "mainwindow.h"
                3. int main(int argc, char *argv[])
                4. {
                5.     QApplication app(argc, argv);
                6.     MainWindow mainWin;
                7.     mainWin.show();
                8.     return app.exec();
                9. }


                mainwindow.cpp :
                1. #include <QtGui>
                2. #include "mainwindow.h"
                3. MainWindow::MainWindow()
                4. {
                5.     setFixedSize(200, 130);
                6.     //création des trois ligne pour entrer l'emplacement des fichiers et la clef de cryptage
                7.     ligneEmplacementFichierACrypter = new QLineEdit(this);
                8.     ligneEmplacementFichierACrypter->setGeometry(10, 10, 180, 20);
                9.     ligneEmplacementFichierCrypter = new QLineEdit(this);
                10.     ligneEmplacementFichierCrypter->setGeometry(10, 40, 180, 20);
                11.     ligneClefDeCryptage = new QLineEdit(this);
                12.     ligneClefDeCryptage->setGeometry(10, 70, 180, 20);
                13.     //création d'un bouton pour lancer le cryptage
                14.     boutonLancerCryptage = new QPushButton(("Lancer le cryptage"), this);
                15.     boutonLancerCryptage->setGeometry(10, 100, 180, 20);
                16.     connect(boutonLancerCryptage, SIGNAL(clicked()), this, SLOT(lancerCryptage()));
                17. }
                18. void MainWindow::lancerCryptage()
                19. {
                20.     //Je récupère le contenu des lignes
                21.     QString emplacementFichierACrypter = ligneEmplacementFichierACrypter->text();
                22.     QString emplacementFichierCrypter = ligneEmplacementFichierCrypter->text();
                23.     QString clefDeCryptage = ligneClefDeCryptage->text();
                24.     //Je créer deux pointeurs sur mes deux fichiers
                25.     QFile fin(emplacementFichierACrypter);
                26.     QFile fout(emplacementFichierCrypter);
                27.     //Ensuite, j'ouvre mes deux fichiers
                28.     fin.open(QFile::ReadOnly);
                29.     fout.open(QFile::WriteOnly);
                30.     //En principe, c'est ici que j'apelle la fonction XOR
                31.     //Et enfin, je les ferme
                32.     fin.close();
                33.     fout.close();
                34. }
                35. void MainWindow::ReadXorAndWrite(FILE *fin,FILE *fout,char key[30])
                36. {
                37.     char ch;
                38.     int xoring;
                39.     int i = 0;
                40.     while(1)
                41.     {
                42.         if(!fread(&ch,sizeof(char),1,fin))
                43.             break;
                44.         else
                45.         {
                46.             if(key[i] == '\0')
                47.             {
                48.                 i = 0;
                49.             }
                50.             xoring = ch ^ key[i];
                51.             fwrite(&xoring,sizeof(char),1,fout);
                52.         }
                53.         i++;
                54.     }
                55. }


                mainwindow.h :
                1. #ifndef MAINWINDOW_H
                2. #define MAINWINDOW_H
                3. #include <QMainWindow>
                4. class QLineEdit;
                5. class QPushButton;
                6. class MainWindow : public QMainWindow
                7. {
                8.     Q_OBJECT
                9. public:
                10.     MainWindow();
                11. private slots:
                12.     void lancerCryptage();
                13. private:
                14.     void ReadXorAndWrite(FILE *fin,FILE *fout,char key[30]);
                15.     QLineEdit *ligneEmplacementFichierACrypter;
                16.     QLineEdit *ligneEmplacementFichierCrypter;
                17.     QLineEdit *ligneClefDeCryptage;
                18.     QPushButton *boutonLancerCryptage;
                19. };
                20. #endif


                J'ai racourci le plus possible, quand à la fonction XOR, j'ai mis celle d'origine car chez moi, des que j'essai de la modifier, j'obtient tout une serie d'erreur :(

                Sinon, comment faire pour récupérer le contenu d'une ligne en QChar ?
                merci de votre aide
                • Partager sur Facebook
                • Partager sur Twitter
                  9 août 2007 à 13:56:05

                  code non testé !!!
                  1. void MainWindow::ReadXorAndWrite(QFile &fin,QFile &fout,QString key) // changement des types des paramètres
                  2. {
                  3.     char ch;
                  4.     int xoring;
                  5.     int i = 0;
                  6.     while(1)
                  7.     {
                  8.         if(fin.read(&ch,1)) // modif ici (on lit 1 char)
                  9.             break;
                  10.         else
                  11.         {
                  12.             if(key[i] == '\0')
                  13.             {
                  14.                 i = 0;
                  15.             }
                  16.             xoring = ch ^ key[i]; // <-- un [0] laissé en trop
                  17.             fout.write(&ch,1); et ici (on écrit un char)
                  18.         }
                  19.         i++;
                  20.     }
                  21. }


                  modification faite (vestige non supprimés)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 août 2007 à 14:34:35

                    merci, j'ai essayé, mais quand je compile, j'ai des erreurs :

                    mainwindow.cpp: In member function `void MainWindow::ReadXorAndWrite(QFile&, QFi
                    le&, QString)':
                    mainwindow.cpp:48: error: invalid conversion from `char' to `char*'
                    mainwindow.cpp:48: error:   initializing argument 1 of `qint64 QIODevice::read(c
                    har*, qint64)'
                    mainwindow.cpp:56: error: invalid types `char[int]' for array subscript
                    mingw32-make[1]: *** [release\mainwindow.o] Error 1
                    mingw32-make[1]: Leaving directory `C:/Documents and Settings/PropriÚtaire/Mes d
                    ocuments/Program/crypteur'
                    mingw32-make: *** [release] Error 2


                    Malgré tout, y'en a beaucoup moin qu'avant :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 août 2007 à 14:56:34

                      voilà une fonction qui marche :
                      1. void MainWindow::ReadXorAndWrite(QFile &fin,QFile &fout,QString key)
                      2. {
                      3.         char ch[2] = {0};
                      4.         char xoring[2] = {0};
                      5.         int i = 0;
                      6.         while(1)
                      7.         {
                      8.                 if(fin.read(ch,1) < 1)
                      9.                         break;
                      10.                 else
                      11.                 {
                      12.                         if(i >= key.size())
                      13.                         {
                      14.                                 i = 0;
                      15.                         }
                      16.                         xoring[0] = ch[0] ^ key.at(i).toAscii();
                      17.                         fout.write(xoring,1);
                      18.                 }
                      19.                 i++;
                      20.         }
                      21. }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 août 2007 à 15:27:55

                        Je n'aurai qu'un mot (ou plutot deux)

                        Merci minirop !!!!!!!!! :D
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Problème avec Qt

                        × 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