Partage
  • Partager sur Facebook
  • Partager sur Twitter

programme de dechiffrage

    1 décembre 2020 à 21:40:32

    Bonsoir, 

    comme indiqué, je dois réaliser un programme de déchiffrage d'un fichier chiffré que mon prof nous a dit de télécharger.

    J'ai réussi à coder la grande majorité du code, j'ai procédé par plusieurs étapes, tout d'abord, j'ai récupérer (logique haha) le fichier via la fonction fopen.

    j'ai doc récupérer les infos du fichier, je les ais affiche en caractère (%c) et en décimale (%d).

    j'ai ensuite converti mmes nombres décimaux en binaire avec la fonction converse que j'ai crée.

    J'ai ma matrice I5234, donc j'ai regroupé tout mes binaires ensuite sous cette ordre avec la fonction assemblage.

    Donc voilà, maintenant j'obtiens une serie de binaire, je dois juste convertir celà en decimale pour enfin dechiffre le fichier...

    Voici mon code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    long getFileSize(FILE *fp)
    {
        long debut, fin;
        debut = ftell(fp);
        fseek(fp, 0, 2);
        fin = ftell(fp);
        fseek(fp, debut, 0);
        return fin;
    }
    
    void converse(int c){
        int tab[8];
        int valeur = 0;
        int x = 0;
        int binaire = 0;
        while( x < 8){
            tab[x] = c%2;
            c = c/2;
            x++;
        }
        for(int x = 7; x >= 0; x--){
            printf("%d", tab[x]);
        }
    }
    
    void assemblage(int c){
        int tab[8];
        int valeur = 0;
        int x = 0;
        int k = 0;
        int binaire = 0;
        while( x < 8){
            tab[x] = c%2;
            c = c/2;
            x++;
        }
        for(int x = 7; x >= 0; x--){
            printf("%d%d%d%d", tab[3],tab[6],tab[5],tab[4]);
            break;
        }
    }
    
    void dec(int c){
        int tab[8];
        int valeur = 0;
        int x = 0;
        char k[255];
        int n = 0;
        int binaire = 0;
        while( x < 8){
            tab[x] = c%2;
            c = c/2;
            x++;
        }
        for(int x = 7; x >= 0; x--){
            //printf("%d%d%d%d", tab[3],tab[6],tab[5],tab[4]);
            sprintf(k, "%d%d%d%d", tab[3],tab[6],tab[5],tab[4]);
            puts(k);
            break;
        }
    }
    
    int main()
    {
        FILE *fp;
    
        int k = 0;
        int tab2[255];
          fp = fopen("C:\\Users\\jeffr\\OneDrive\\Bureau\\projetsecu\\EPREUVE 1.txtc (1).txtc", "r");
          if (fp != NULL) {
            // traitement du contenu du fichier
             unsigned char c = fgetc(fp);
            printf("\nFichier de base initial: \n\n");
             while ( ! feof( fp) ){
            printf("%c ", c);
            tab2[k] = c;
            k++;
            //converse(c);
            c = fgetc(fp);
          }
          } else {
            printf("erreur d'acces au fichier") ;
          }
    
        int j = 0;
        int tab1[255];
          fp = fopen("C:\\Users\\jeffr\\OneDrive\\Bureau\\projetsecu\\EPREUVE 1.txtc (1).txtc", "r");
          if (fp != NULL) {
            // traitement du contenu du fichier
             unsigned char c = fgetc(fp);
            printf("\nFichier de base: \n\n");
             while ( ! feof( fp) ){
            printf("%d ", c);
            tab1[j] = c;
            j++;
            //converse(c);
            c = fgetc(fp);
          }
          } else {
            printf("erreur d'acces au fichier") ;
          }
          long fileSize = getFileSize(fp);
          printf("\n\n\nTaille du fichier = %d\n\n\n", fileSize);
          for(j=0; j < 154; j++){
            converse(tab1[j]);
            printf(" || ");
          }
          printf("\n\n\nRecuperation: \n\n\n");
    
          for(j=0; j < 154; j++){
            assemblage(tab1[j]);
            printf(" || ");
          }
    
          printf("\n\n\nbinaire final: \n\n\n");
    
          for(j=0; j < 154; j= j+2){
            assemblage(tab1[j]);
            printf(" ");
            assemblage(tab1[j+1]);
            printf(" | ");
          }
    
          printf("\n\n\nhexa final: \n\n\n");
    
          for(j=0; j < 154; j= j+2){
            dec(tab1[j]);
            printf(" ");
            dec(tab1[j+1]);
          }
    
    
          return 0;
    }
    

    voilà, donc comme vous pouvez le voir, j'essaye de recupérer mes binaires avec la fonction sprintf pour ensuite les pouvoir mettre dans une variable, je met bien la fonction puts pour les afficher, or quand je fais un for, je perd tout mes valeurs :(

    pourriez-vous m'aider svp à convertir mes binaires que j'obtiens en decimale.

    Merci à ceux qui liront jusqu'au bout :))

    • Partager sur Facebook
    • Partager sur Twitter
      1 décembre 2020 à 21:49:31

      Bonjour

      Le fichier n'est pas super lisible, pas indenté, confus, … enfin bref.

      Sinon la boucle de lecture n'est pas bonne → 

      while ( ! feof( fp) ){

      Si tu regardes la man page de fgetc →

      fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

      En gros, tant que tu ne reçois pas l'entier EOF alors c'est que tu as lu un caractère. Si tu reçois EOF c'est que tu es peut-être en fin de fichier ou qu'il y a eu une erreur.  C'est uniquement à ce moment que tu utilises la fonction feof qui reverra vrai pour t'indiquer que tu es en fin de fichier, si ce n'est pas le cas c'est qu'il y a eu une erreur et dans ce cas il faut faire appel à la fonction ferror pour déterminer l'erreur. Une fois tout ça fait tu peux faire un clearerr pour faire un reset de ces indicateurs.

      Je n'ai regardé que ça et pas le reste du code.

      • Partager sur Facebook
      • Partager sur Twitter
        1 décembre 2020 à 22:05:16

        Je ne comprends pas, oui c'est bien ce que j'ai voulu faire avec fgetc, c'est ce que j'ai toujours fait d'ailleurs, mais pourquoi je ne devrais pas l'utiliser ? et dans quelle cas ça me déclencherait une erreur ?
        • Partager sur Facebook
        • Partager sur Twitter
          1 décembre 2020 à 22:12:58

          Tu m'as mal compris : tu utilises mal feof. feof n'a pas été conçu pour être utilisé comme tu le fais. Une boucle classique de lecture caractère par caractère d'un flux ressemble à :

          int c;
          while ((c = fgetc(fp)) != EOF) {
             ...   /*   utilisation de c   */
          }
          
          // Ici on sort de la boucle cela signifie qu'il y a soit eu une fin de fichier soit une erreur de lecture
          // pour différencier les deux cas on fait :
          if (feof(fp)) {
             // on fait ce qu'il faut en cas de fin de fichier
          } else if (ferror(fp)) {
             // on fait ce qu'il faut en cas d'erreur de lecture
          }
          clearerr(fp); // on réinitialise les indicateurs
          


          L'autre erreur est que tu place le retour de fgetc dans un unsigned char (pourquoi d'ailleurs ?) au lieu d'un int. Il faut impérativement utiliser un int pour pouvoir récupérer le EOF.

          -
          Edité par White Crow 1 décembre 2020 à 22:13:10

          • Partager sur Facebook
          • Partager sur Twitter

          programme de dechiffrage

          × 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