Advertisement
AntonioVillanueva

Base64 con ficheros Lectura y Escritura

Jul 13th, 2016
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.58 KB | None | 0 0
  1. #include <ctype.h>
  2. #include <math.h>
  3. #include <string.h>
  4. #include <inttypes.h>
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include <stdlib.h>
  8.  
  9. const char *encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  10.  
  11.  
  12.  //----------------------------------------------------------------------------------
  13. unsigned char pos_base64(char c)//Retorna posicion en Base64
  14. {
  15.     int pos=0;
  16.     const char *ref=encoding;
  17.  
  18.     while (c !=*encoding ){
  19.         //printf ("Busca=%c=%d  Compara=%c \n",c,pos,*encoding );      
  20.         encoding++;
  21.         pos++;        
  22.     }
  23.     encoding=ref;
  24.     return pos;
  25. }
  26.  //----------------------------------------------------------------------------------
  27. int sizeFile (FILE *source)
  28. {
  29.     int size=0;
  30.     unsigned char c=1;
  31.     while (c!=(unsigned char)EOF){
  32.         c=fgetc(source);
  33.         size++;
  34.     };
  35.     size-=1;
  36.     rewind (source);
  37.     return size;
  38. }
  39.  
  40.  
  41.  
  42. int to_base64(const char *dst_file, const char *src_file)
  43. {
  44.      
  45.     //const char *encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  46.     char b24[4];
  47.     unsigned char c=1;
  48.     int size=0;
  49.     int sizeOrg=0;
  50.     int columna=0;
  51.      
  52.     //Abre ficheros
  53.     FILE *src,*dst;
  54.     src=fopen(src_file,"r");  
  55.        
  56.     if (!src){
  57.         fprintf (stderr," A ) Fallo apertura fichero fuente %s !!!",src_file);
  58.         return -1;
  59.     }else printf ("OK apertura %s\n",src_file);
  60.      
  61.     dst=fopen(dst_file,"w+");  
  62.        
  63.     if (!dst){
  64.         fprintf (stderr,"B ) Fallo apertura fichero destino %s !!!",dst_file);
  65.         return -1;
  66.     }else printf ("OK apertura %s\n",dst_file);
  67.      
  68.      
  69.     //Analisis longitud
  70.      while (c!=(unsigned char)EOF){
  71.         c=fgetc(src);
  72.        // printf ("%c",c);
  73.         size++;
  74.     };
  75.     size-=1;
  76.     sizeOrg=size;
  77.     rewind (src);
  78.      
  79.     printf ("Size original = %d\n",size);
  80.      
  81.     while (size%3){size++;}//rectificador de tamano
  82.     printf ("Size rectificado = %d\n",size);
  83.     //Dimensiona la copia
  84.    
  85.     char * copia= (char*)calloc( (size+4) , sizeof ( char ) );
  86.     char * copiaRef=copia;//direccion referencia
  87.      
  88.      
  89.     int *org=(int*)copia;//32 bits;
  90.     char *org2=copia;
  91.     copiaRef=copia;
  92.    
  93.     c=1;
  94.     //Efectua la copia
  95.     while (c!=(unsigned char)EOF){
  96.      
  97.         c=fgetc(src);
  98.         //printf ("Copia 0x%x %c\n",c,c);
  99.         if (c<=254){*copia=c;}
  100.         copia++;
  101.     };
  102.     *copia=EOF;//EOF
  103.  
  104.     copia=copiaRef;
  105.     org= (int*)copiaRef;
  106.      
  107.     org2=copiaRef;
  108.      
  109.     for (int i=0 ;i<size;i+=3){
  110.      
  111.      
  112.     b24[0]= encoding [(int) ((*org) & (0x000000FC))>>2];
  113.     b24[1]= encoding [ (((int) ((*org) & (0x00000003)))<<4 ) | (int) ((*org) & (0x0000FF00))>>(8+4)  ];
  114.     b24[2]= encoding [  (((int) ((*org) & (0x00000F00))) >>(4+2) ) | (int) ((*org) & (0x00C00000))>>(16+6)  ];
  115.     b24[3]= encoding [  (((int) ((*org) & (0x003F0000))) >>(16) )];
  116.  
  117.         printf ("%c", b24[0]);fprintf(dst,"%c",b24[0] );
  118.          
  119.         if (i+1 >sizeOrg  ){b24[1]='=';}
  120.         printf ("%c", b24[1]);fprintf(dst,"%c",b24[1] );
  121.          
  122.         if (i+2 >sizeOrg ){b24[2]='=';}
  123.         printf ("%c", b24[2]);fprintf(dst,"%c",b24[2] );
  124.          
  125.         if (i+3 >sizeOrg ){b24[3]='=';}
  126.         printf ("%c", b24[3]);fprintf(dst,"%c",b24[3] );
  127.          
  128.                 columna+=4;
  129.          
  130.         if (columna>=64){fprintf (dst,"%c",0x0a);columna=0;}
  131.         //int fputc(int char, FILE *stream)
  132.    
  133.          
  134.         org2+=3;
  135.         org= (int*)org2;
  136.    
  137.     }
  138.      
  139.         printf ("\n\n");
  140.      
  141.     free (copia);
  142.     fclose(src);
  143.     fclose (dst);
  144.     return sizeOrg;
  145. }
  146.  
  147.  
  148.   int from_base64(const char *dst_file, const char *src_file)
  149. {
  150.  
  151.     int sizeOrg=0;
  152.     unsigned char c=1;
  153.     unsigned char buffer;
  154.  
  155.     FILE *src,*dst;
  156.     src=fopen(src_file,"r");
  157.      
  158.     //Abre ficheros      
  159.     if (!src){
  160.         fprintf (stderr," A ) Fallo apertura fichero fuente %s !!!",src_file);
  161.         return -1;
  162.     }else printf ("OK apertura %s\n",src_file);
  163.      
  164.     dst=fopen(dst_file,"w+");  
  165.        
  166.     if (!dst){
  167.         fprintf (stderr,"B ) Fallo apertura fichero destino %s !!!",dst_file);
  168.         return -1;
  169.     }else printf ("OK apertura %s\n",dst_file);
  170.    
  171.    
  172.     sizeOrg=sizeFile (src);//Analiza tamano
  173. //----------------------------------------------------------------------------------
  174. // copia
  175.     char * copia= (char*)calloc( (sizeOrg) , sizeof ( char ) );
  176.     char * copiaRef=copia;//direccion referencia
  177. //----------------------------------------------------------------------------------
  178. //Efectua la copia
  179.     while (c!=(unsigned char)EOF){
  180.      
  181.         c=fgetc(src);
  182.         printf ("Copia 0x%x %c\n",c,c);
  183.        *copia=c;
  184.         copia++;
  185.     };
  186.    // *copia=EOF;//EOF
  187.    
  188.    if (*(copia)=='='){--sizeOrg;printf ("A rectifica size=%d\n",sizeOrg);}
  189.    if (*(--copia)=='='){--sizeOrg;printf ("B rectifica size=%d\n",sizeOrg);}
  190.    
  191.     copia=copiaRef;
  192.  
  193. //----------------------------------------------------------------------------------
  194. //  Transformacion de Base64 a Equivalente por posicion 0 es A 1 22 es w
  195.     for (int i=0;i<sizeOrg;i++){
  196.         *copia = (pos_base64(*copia));//Retorna posicion en Base64
  197.         //if (*copia==64 && i>(sizeOrg-4)){*copia=0;}
  198.         ++copia;
  199.     }
  200.     copia=copiaRef;
  201. //----------------------------------------------------------------------------------
  202.  
  203.  printf ("NUevo tamano decodificado =%d\n",(sizeOrg-(sizeOrg/4)));
  204. #define MAX  (sizeOrg-(sizeOrg/4))            
  205.                
  206.     for (int i=0;i<(MAX);i+=3){
  207.     char B0=(*(copia+0));
  208.     char B1=(*(copia+1));
  209.     char B2=(*(copia+2));
  210.     char B3=(*(copia+3));
  211.        
  212.        
  213. //Tratamiento  1
  214.         buffer=( (B0 <<2)  | ((B1 & 0x30)>>4) );
  215.         printf ("%c", buffer);
  216.         //if (buffer && buffer<127)
  217.  
  218.         {fprintf(dst,"%c",buffer );}
  219.         B1=(*(copia+1));
  220. //Tratamiento  2
  221.         buffer = ((B1 & 0x0F)<<4 | (B2 )>>2 );
  222.         printf ("%c", buffer);
  223.         //if (buffer && buffer<127)
  224.         {fprintf(dst,"%c",buffer );}
  225.         B2=*(copia+2);      
  226. //Tratamiento  3
  227.         buffer=( (B2 & 0x03) <<6 | (B3 &0x3F) );
  228.         printf ("%c", buffer);
  229.         //if (buffer && buffer<127)
  230.         {fprintf(dst,"%c",buffer );}
  231.         copia+=4;  
  232.        
  233.         printf ("pos=%d\n",i);
  234.     }
  235.  
  236.     //fprintf (dst,"%c",0);
  237.  
  238. //----------------------------------------------------------------------------------
  239.    
  240.     fclose (dst);
  241.     fclose (src);
  242.    
  243.    
  244.     return sizeOrg;
  245. }
  246.  
  247.  
  248.  
  249. int main()
  250. {
  251.     //char f []={"any carnal pleasure."};// YW55IGNhcm5hbCBwbGVhc3VyZS4= padding1
  252.  
  253.     //printf ("N° letras %d\n",to_base64("copia.txt","oneline.txt"));//OK
  254.    // printf ("N° letras %d\n",to_base64("copia.txt","testi.txt"));//OK    
  255.   printf ("taille original =%d \n", from_base64("decodificado.txt","simple.bin.ref"));
  256.    
  257.     return 0;
  258. }
  259.  
  260. /*
  261. This file has text only on one line. Wow.   VGhpcyBmaWxlIGhhcyB0ZXh0IG9ubHkgb24gb25lIGxpbmUuIFdvdy4=
  262. La entrada termina con: any carnal pleasure.  La salida termina con: YW55IGNhcm5hbCBwbGVhc3VyZS4=
  263. La entrada termina con: any carnal pleasure   La salida termina con: YW55IGNhcm5hbCBwbGVhc3VyZQ==
  264. La entrada termina con: any carnal pleasur    La salida termina con: YW55IGNhcm5hbCBwbGVhc3Vy
  265. La entrada termina con: any carnal pleasu     La salida termina con: YW55IGNhcm5hbCBwbGVhc3U=
  266. La entrada termina con: any carnal pleas      La salida termina con: YW55IGNhcm5hbCBwbGVhcw==
  267. */
  268.        
  269. //Dennis Ritchie a dit un jour :
  270. //"La meilleure façon d'apprendre à programmer, c'est de programmer."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement