Need Help with base64

Diez B. Roggisch deets at nospam.web.de
Mon Jul 23 08:30:27 EDT 2007


pycraze wrote:

> Hi ,
> 
>   I am currently trying to implement base64 encoding and decoding
> scheme in C . Python has a module , base64 , that will  do the
> encoding and decoding with ease . I am aware of OpenSSL having support
> for base64 encoding and decoding , but i will have to now implement
> both in C without using the openssl libraries .
> 
>     I was able to download a code w.r.t. base 64 encoding and
> decoding . I am attaching the code below .
> 
> 
> void encodeblock( unsigned char cin[3], unsigned char cout[4], int
> nlen )
> {
> 
>     cout[0] = cb64[ cin[0] >> 2 ];
>     cout[1] = cb64[ ((cin[0] & 0x03) << 4) | ((cin[1] & 0xf0) >> 4) ];
>     cout[2] = (unsigned char) (nlen > 1 ? cb64[ ((cin[1] & 0x0f) << 2)
> | ((cin[2] & 0xc0) >> 6) ] : '=');
>     cout[3] = (unsigned char) (nlen > 2 ? cb64[ cin[2] & 0x3f ] :
> '=');
> }
> 
> 
> void decodeblock( unsigned char cin[4], unsigned char cout[3] )
> {
>     cout[ 0 ] = (unsigned char ) (cin[0] << 2 | cin[1] >> 4);
>     cout[ 1 ] = (unsigned char ) (cin[1] << 4 | cin[2] >> 2);
>     cout[ 2 ] = (unsigned char ) (((cin[2] << 6) & 0xc0) | cin[3]);
> }
> 
> 
> int base641_decodestring(char* pcstr,int size,char** ppcdest)
> {
>       unsigned char cin[4] = {""};
>   unsigned char cout[3] = {""};
>       unsigned char  cv = 0;
>       int ni = 0;
>   int nlen = 0;
>       char* cptr = pcstr;
>       *ppcdest = malloc(sizeof(char)*160);
>       if (!*ppcdest)
>         {
>             return 1;
>         }
>       memset(*ppcdest,0,sizeof(char)*160);
> 
>   char* pcstring = malloc( sizeof(char) * SIZE);
>     if (!pcstring)
>       {
>           aps_log("APS_log.txt","\nbae64.c:base64encode:malloc failed
> \n");
>           return 1;
>       }
>   memset(pcstring,'\0',SIZE);
> 
>         for( nlen = 0, ni = 0; ni < 4; ni++ )
>   {
>             cv = 0;
>             while(  cv == 0 )
>       {
>                 cv = (unsigned char) *cptr;
>                 cv = (unsigned char) ((cv < 43 || cv > 122) ? 0 :
> cd64[ cv - 43 ]);
>                 if( cv )
>     {
>                     cv = (unsigned char) ((cv == '$') ? 0 : cv - 61);
>                 }
>             }
>             if( cptr++ )
>       {
>                 nlen++;
>                 if( cv )
>     {
>                     cin[ ni ] = (unsigned char) (cv - 1);
>                 }
>             }
>             else
>       {
>                 cin[ni] = 0;
>             }
>         }
>         if( nlen )
>   {
>             decodeblock( cin, cout );
> 
>         }
>   memcpy(*ppcdest,cout,160);
>   return 0;
> }/*end of base64_decode */
> 
> char* base64_encode(char* pcstr)
> {
>   unsigned char cin[3] = {""};
>   unsigned char cout[4] = {""};
>   int ni = 0;
>   int nlen = 0;
>   int flag = 1;
>   char* cptr = pcstr;
>   char* pcstring = malloc( sizeof(char) * SIZE);
>     if (!pcstring)
>       {
>           aps_log("APS_log.txt","\nbae64.c:base64encode:malloc failed
> \n");
>           return (void*)0;
>       }
>   memset(pcstring,'\0',SIZE);
>   while( flag )
>   {
>     for( ni = 0; ni < 3; ni++ )
>     {
>       cin[ni] = (unsigned char)*cptr;
>       if( *++cptr != '\0' )
>         nlen++;
>       else
>       {
>         cin[ni] = 0;
>               flag = 0;
>         break;
>       }
>     }
>     encodeblock(cin, cout,nlen);
>     strcat(pcstring,cout);
>   }
> 
>   return pcstring;
> 
> }/* end of base64_encode */
> 
> 
>           But this code gives different hex values as compared to the
> python base64.encodestring and base64.decodestring respectively .
> 
>          I need some help on this matter . I need some pointers on
> where is the mistake for the above file .

How about posting that in a C-newsgroup? python _has_ base64-encoding
support.

Diez



More information about the Python-list mailing list