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