// Base 64 encoder / decoder

AnsiString Base64Encoder(AnsiString slToEnc)

{

//The Base64 Table

const char Base64Table[64]=

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

char * buftoenc = slToEnc.c_str();

int bufsize = slToEnc.Length() + 1;

char * encbuf = new char[slToEnc.Length() * 5];

encbuf[
0] = '\0'; int ilStrLen = -1;

int i=0; int b64byte[5];

unsigned
char *buftemp;

AnsiString slRetVal
= EmptyStr;





buftemp
=(unsigned char *)malloc(bufsize+2);

strcpy(buftemp,buftoenc);

if (fmod(bufsize,3)==1)

{

buftemp[bufsize]
='\0';

buftemp[bufsize
+1]='\0';

}

if (fmod(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 (fmod(bufsize,3)==0) ilStrLen = bufsize*8/6;

else if (fmod(bufsize,3)==1) ilStrLen = ((bufsize+2)*8/6)-2;

else if (fmod(bufsize,3)==2) ilStrLen = ((bufsize+1)*8/6)-1;

else ilStrLen = -1;

if(ilStrLen> 0) slRetVal = AnsiString(encbuf).SubString(1, ilStrLen);

if(encbuf != NULL) { delete encbuf; encbuf = NULL; }



return slRetVal;

}





//-----------------------------------------------------------------------


AnsiString Base64Decoder(AnsiString slToDec)
{

//Base64 Table
const char Base64Table[64]=

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

char * buftodec = slToDec.c_str();

int bufsize = slToDec.Length() + 1;

char * decbuf = new char[slToDec.Length() * 5];

decbuf[
0] = '\0'; int ilStrLen = -1;

AnsiString slRetVal
= EmptyStr;



int i=0; unsigned char binbyte[4];

int cpos[5]; unsigned char *buftemp;



buftemp
=(unsigned char *)malloc(bufsize);

strcpy(buftemp,buftodec);

if (fmod(bufsize,4)==1)

{

buftemp[bufsize]
='\0';

buftemp[bufsize
+1]='\0';

buftemp[bufsize
+2]='\0';

}

if (fmod(bufsize,4)==2)

{

buftemp[bufsize]
='\0';

buftemp[bufsize
+1]='\0';

}

if (fmod(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 (fmod(bufsize,4)==0) ilStrLen = bufsize*6/8;

else if (fmod(bufsize,4)==1) ilStrLen = ((bufsize+3)*6/8)-3;

else if (fmod(bufsize,4)==2) ilStrLen = ((bufsize+2)*6/8)-2;

else if (fmod(bufsize,4)==3) ilStrLen = ((bufsize+1)*6/8)-1;

else ilStrLen = -1;

if(ilStrLen> 0) slRetVal = AnsiString(decbuf).SubString(1, ilStrLen);

if(decbuf != NULL) { delete decbuf; decbuf = NULL; }

return slRetVal;

}
posted on 2011-06-10 09:28  Glroy  阅读(571)  评论(0编辑  收藏  举报