#include <string.h>
#include <stdlib.h>//Base64Encod
//Encode string
//Param: buftoenc,input string to encode
//       bufsize,input string length
//       encbug, output string encoded
//Return value:Encoded string length??? if fail return -1???
int  Base64Encod(char *buftoenc,int bufsize,char *encbuf) 

   int i=0; 
   int b64byte[5]; 
   unsigned char *buftemp;    //Allocate space for the temporary string 
   buftemp=(unsigned char *)malloc(bufsize+2); 
   strcpy(buftemp,buftoenc); 
   if (bufsize%3==1) 
   { 
      buftemp[bufsize]='\0'; 
      buftemp[bufsize+1]='\0'; 
   } 
   if (bufsize%3==2)buftemp[bufsize]='\0'; 
   while (i<bufsize) 
   { 
      b64byte[0]=buftemp[i]>>2; 
      b64byte[1]=((buftemp[i]&3)<<4)|(buftemp[i+1]>>4); 
      b64byte[2]=((buftemp[i+1]&0x0F)<<2)|(buftemp[i+2]>>6); 
      b64byte[3]=buftemp[i+2]&0x3F; 
      encbuf[i+(i/3)]=Base64Table[b64byte[0]]; 
      encbuf[i+(i/3)+1]=Base64Table[b64byte[1]]; 
      encbuf[i+(i/3)+2]=Base64Table[b64byte[2]]; 
      encbuf[i+(i/3)+3]=Base64Table[b64byte[3]]; 
      i+=3; 
   } 
   free(buftemp); 
   if (bufsize%3==0)return bufsize*8/6; 
   if (bufsize%3==1)return((bufsize+2)*8/6)-2; 
   if (bufsize%3==2)return((bufsize+1)*8/6)-1; 
   return -1; 
} //Base64Decod
//Encode string
//Param: buftodec,input string to decode
//       bufsize,input string length
//       decbug, output string decoded
//Return value:Decoded string length??? if fail return -1???
int Base64Decod(char *buftodec, int bufsize, char *decbuf)

   int i=0; 
   unsigned char binbyte[4]; 
   int cpos[5]; 
   unsigned char *buftemp;    //Allocate space for the temporary string 
   buftemp=(unsigned char *)malloc(bufsize + 4); 
   strcpy((char*)buftemp,buftodec); 
   if (bufsize%4==1) 
   { 
      buftemp[bufsize]='\0'; 
      buftemp[bufsize+1]='\0'; 
      buftemp[bufsize+2]='\0'; 
   } 
   if (bufsize%4==2) 
   { 
      buftemp[bufsize]='\0'; 
      buftemp[bufsize+1]='\0'; 
   } 
   if (bufsize%4==3)buftemp[bufsize]='\0'; 
   while (i<bufsize) 
   { 
      cpos[0]=strchr(Base64Table,buftemp[i])-Base64Table; 
      cpos[1]=strchr(Base64Table,buftemp[i+1])-Base64Table; 
      cpos[2]=strchr(Base64Table,buftemp[i+2])-Base64Table; 
      cpos[3]=strchr(Base64Table,buftemp[i+3])-Base64Table; 
      binbyte[0]=((cpos[0]<<2)|(cpos[1]>>4)); 
      binbyte[1]=((cpos[1]<<4)|(cpos[2]>>2)); 
      binbyte[2]=(((cpos[2]&0x03)<<6)|(cpos[3]&0x3f)); 
      decbuf[i-(i/4)]=binbyte[0]; 
      decbuf[i-(i/4)+1]=binbyte[1]; 
      decbuf[i-(i/4)+2]=binbyte[2]; 
      i+=4; 
   } 
   free(buftemp); 
   if (bufsize%4==0)return bufsize*6/8; 
   if (bufsize%4==1)return((bufsize+3)*6/8)-3; 
   if (bufsize%4==2)return((bufsize+2)*6/8)-2; 
   if (bufsize%4==3)return((bufsize+1)*6/8)-1; 
   return -1; 
}