// Number to BASE64
char Get64(char c){c&=63;if(c<26)return c+65;if(c<52)return c+71;
if(c<62)return c-4;if(c==62)return'+';return'/';}
// BASE64 to number
char Conv64(char c){if(c=='=')return 0;
if(c=='+')return 62;if(c=='/')return 63;
if(c<58)return c+4;if(c<91)return c-65;if(c<123)return c-71;}
// String to BASE64
void Enc64(char *dst,char *src){char get,put;for(;;){if(!src[get])break;
dst[put]=Get64(src[get]>>2);
if(!src[get+1]){dst[put+1]=Get64((src[get]&3)<<4);dst[put+2]='=';
dst[put+3]='=';dst[put+4]=0;break;}
dst[put+1]=Get64(((src[get]&3)<<4)+(src[get+1]>>4));
if(!src[get+2]){dst[put+2]=Get64((src[get+1]&15)<<2);
dst[put+3]='=';dst[put+4]=0;break;}
dst[put+2]=Get64(((src[get+1]&15)<<2)+(src[get+2]>>6));
dst[put+3]=Get64(src[get+2]&63);dst[put+4]=0;get+=3;put+=4;}}
// BASE64 to string
void Dec64(char *dst,char *src){char get,put,c1,c2,c3;
for(;;){if(!src[get])break;
c1=Conv64(src[get++])<<2;c2=Conv64(src[get++]);c1|=(c2>>4)&3;
c3=Conv64(src[get++]);c2=c2<<4|((c3>>2)&15);
c3=c3<<6|Conv64(src[get++]);
dst[put++]=c1;if(c2){dst[put++]=c2;if(c3)dst[put++]=c3;}}dst[put]=0;}
// Get BASE64 string
void Test(){char *buf=MemoryAlloc(64),*res=MemoryAlloc(128);
PrStr("String=");Gets(buf,64);Enc64(res,buf);PrStr(res);PrStr("\r\n");
Dec64(res,res);PrStr(res);MemoryFree(buf);MemoryFree(res);}
