#include<stdio.h>
#include<stdlib.h>
#include<string.h>
extern char *base64_decode(const char*,char **);
extern char *base64_encode(const char*,char **);
#include "base64.h"
static char base64_table[255];
void base64_tableinit()
{
int i,j;
bzero(base64_table,255);
for(j=0,i='A';i<='Z';i++)
base64_table[i]=j++;
for(i='a';i<='z';i++)
base64_table[i]=j++;
for(i='0';i<='9';i++)
base64_table[i]=j++;
base64_table['+']=j++;
base64_table['/']=j++;
base64_table['=']=j;
}
char *base64_decode(const char *cptr,char **rptr)
{
char *res;
int clen,len;
static int init=0;
if(cptr==NULL)
return NULL;
len=strlen(cptr);
if(len%4)
return NULL;
if(!init)
{
init=1;
base64_tableinit();
}
clen=len/4;
if((res=malloc(len-clen))==NULL)
return NULL;
for(*rptr=res;clen--;)
{
*res=base64_table[*cptr++]<<2&0xfc;
*res++|=base64_table[*cptr]>>4;
*res=base64_table[*cptr++]<<4&0xf0;
*res++|=base64_table[*cptr]>>2&0x0f;
*res=base64_table[*cptr++]<<6;
if(*cptr!='=')
*res++|=base64_table[*cptr++];
}
return *rptr;
}
char *base64_encode(const char *cptr,char **rptr)
{
char *res;
int i,clen,len;
len=strlen(cptr);
clen=len/3;
if(cptr==NULL||(res=malloc(clen+3*2+len))==NULL)
return NULL;
for(*rptr=res;clen--;)
{
*res++=*cptr>>2&0x3f;
*res=*cptr++<<4&0x30;
*res++|=*cptr>>4;
*res=(*cptr++&0x0f)<<2;
*res++|=*cptr>>6;
*res++=*cptr++&0x3f;
}
if(i=len%3)
{
if(i==1)
{
*res++=*cptr>>2&0x3f;
*res++=*cptr<<4&0x30;
*res++='=';
*res++='=';
}
else
{
*res++=*cptr>>2&0x3f;
*res=*cptr++<<4&0x30;
*res++|=*cptr>>4;
*res++=(*cptr&0x0f)<<2;
*res++='=';
}
}
*res='=';
for(res=*rptr;*res!='=';res++)
*res="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[*res];
rptr[0][strlen(*rptr)-1]='\0';
return *rptr;
}
#include "base64.h"
int main(void)
{
char *src="abc";
char *buf;
base64_encode(src,&buf);
printf("base64 encode:%s\n",buf);
char *dec_buf;
base64_decode(buf,&dec_buf);
printf("base64 decode:%s\n",dec_buf);
free(buf);
free(dec_buf);
return 0;
}