Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Défis] #8 : Tout en Base64

Pour tous les niveaux

    1 septembre 2018 à 23:13:59

    Bonjour  je n comprend pas cette pĥrase :

    Ainsi 'a' correspond à 91 en décimale ...

     Lorsque je regarde la correspondance de la table ASCII 91 vaut le cygle ] et a vaut 97.



    • Partager sur Facebook
    • Partager sur Twitter
      2 septembre 2018 à 13:26:58

      Code Rom a écrit:

      Bonjour  je n comprend pas cette pĥrase :

      Ainsi 'a' correspond à 91 en décimale ...

       Lorsque je regarde la correspondance de la table ASCII 91 vaut le cygle ] et a vaut 97.



      Peut-être une erreur, ou bien il y a un contexte autre que la table ascii ...

      • Partager sur Facebook
      • Partager sur Twitter
        2 septembre 2018 à 17:16:14

        Bonjour 

        Ma version est la somme du 1 et du 2. Je viens de regarder les versions des autres participants... et c' est très différent.

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <stdint.h>
        
        const char e_64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        
        char reverseTab(char b64) {
            unsigned int i;
            for(i=0; i<strlen(e_64); i++) {
                if(b64==e_64[i])
                    return (char)i;
                else if(b64=='=')
                    return 0;
            }
            return 0;
        }
        
        #define TAILLE_MAX 100 //'\0' compris
        char * setSource(FILE * stream) {
            char * source = malloc(sizeof(char)*TAILLE_MAX);
            if(!source)exit(EXIT_FAILURE);
        
            int i;
            for(i=0; i<TAILLE_MAX && source[i-1]!='\n'; i++) {
                source[i]=(char)fgetc(stream);
            }
            source[i-1]='\0';
            return source;
        }
        
        char * encode64(char *source, size_t taille) {
            size_t SIZE_BUF_64 = (((taille-1)/3)+1)*4;//Dimention exacte du tableau en base 64
            //printf("char : %d \t 64 ; %d\n\n",SIZE_BUF_CHAR,SIZE_BUF_64);
            char * dest = calloc(SIZE_BUF_64+1,sizeof(char));//+1 Pour '/0'
        
            size_t curseursource=0;
            size_t curseurdest=0;
            size_t i;
            int donnesource;
            size_t octetmanquant = (3-taille%3)%3;
            while(curseursource<taille) {
                donnesource=0;
                for(i=0; i<=2; i++) {
                    donnesource |= source[curseursource]<<8*(2-i);
                    curseursource++;
                }
                for(i=0; i<=3; i++) {
                    dest[curseurdest]= curseursource<taille || i<=3-octetmanquant? e_64[(donnesource&(0b111111<<(6*(3-i))))>>(6*(3-i))] : '=';
                    curseurdest++;
                }
            }
            return dest;
        }
        
        char * decode64(char *source) {
            size_t taille = strlen(source);
            size_t SIZE_BUF_255 = strlen(source)*3/4;//Dimention +/-exacte du tableau en base 256 //C'est forcement un multiple de 4
            char * dest = calloc(SIZE_BUF_255+1,sizeof(char));//+1 Pour '/0'
        
            size_t curseursource=0;
            size_t curseurdest=0;
            size_t i;
            int donnesource;
            while(curseursource<taille) {
                donnesource = 0;
                for(i=0; i<=3; i++) {
                    donnesource |= reverseTab(source[curseursource])<<6*(3-i);
                    curseursource++;
                }
                for(i=0; i<=2; i++) {
                    dest[curseurdest]= (char)((donnesource&(0b11111111<<(8*(2-i))))>>(8*(2-i)));
                    curseurdest++;
                }
            }
            return dest;
        }
        
        int main(void) {
            printf("Voulez-vous encoder(1) ou decoder?\n");
            char choix;
            scanf("%c",&choix);
            while(getchar()!='\n');
        
            printf("flux : stdin(1) ou fichier?\n");
            char choixflux;
            scanf("%c",&choixflux);
            while(getchar()!='\n');
        
            FILE * flux;
            char name[50];
            if(choixflux=='1') {
                printf("Chaine a traiter :\n");
                flux = stdin;
            } else {
                printf("Quel fichier souhaitez-vous traiter?\n");
                scanf("%s",name);
                while(getchar()!='\n');
                flux = fopen(name, "r");
            }
        
            char * strin = setSource(flux);//Initialisation de la chaine d'entre
            char * strout = NULL;
        
            if(choixflux!='1') { //On passe en ecriture
                fclose(flux);
                if(choix=='1')
                    sprintf(name,"%s.base64",name);
                else
                    sprintf(name,"%s.base255",name);
                flux = fopen(name,"w+");
            }
        
            if(choix == '1')
                strout = encode64(strin,strlen(strin));
            else
                strout = decode64(strin);
        
            if(choixflux!='1') {
                fprintf(flux,"%s\n",strout);
                printf("Retrouver le résultat dans le fichier %s\n",name);
                fclose(flux);
            }
            printf("in : %s\n",strin);
            printf("out : %s\n",strout);
            free(strout);
            free(strin);
            return 0;
        }
        

        C'est la première fois que je participe, et je trouve cela plutôt cool :)

        • Partager sur Facebook
        • Partager sur Twitter

        [Défis] #8 : Tout en Base64

        × 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