#include <afx.h>
#include <stdio.h>
unsigned char * base64=(unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
// 编码
CString Base64Encode(CString src, int srclen)
{
int n, buflen, i, j;
CString buf = src;
static unsigned char *dst;
buflen = n = srclen;
dst = (unsigned char*) malloc( buflen / 3 * 4 + 3 );
memset( dst, 0 , buflen / 3 *4+3);
for( i = 0,j = 0; i <= buflen-3 ; i+=3, j+=4)
{
dst[j] = (buf[i] & 0xFC) >> 2;
dst[j+1] = ((buf[i] & 0x03) << 4) + (( buf[i+1] & 0xF0) >> 4);
dst[j+2] = ((buf[i+1] & 0x0F) << 2) + ((buf[i+2] & 0xC0) >> 6);
dst[j+3] = buf[i+2] & 0x3F;
}
if(n%3==1)
{
dst[j] = (buf[i] & 0xFC) >> 2;
dst[j+1] = ((buf[i] & 0x03) << 4);
dst[j+2] = 64;
dst[j+3] = 64;
j+=4;
}
else if( n % 3 == 2)
{
dst[j] = (buf[i] & 0xFC) >> 2;
dst[j+1] = ((buf[i] & 0x03) << 4)+(( buf[i+1] & 0xF0) >> 4);
dst[j+2] = ((buf[i+1] & 0x0F) << 2);
dst[j+3] = 64;
j+=4;
}
for(i=0;i<j;i++)
{
dst[i] = base64[ (int)dst[i] ];
}
dst[j] = 0;
return CString(dst);
}
// 解码
CString Base64Decode(CString inpt, int *len)
{
int n, i, j, pad;
unsigned char *p;
static unsigned char *dst;
unsigned char * src;
*len = 0;
pad = 0;
n = inpt.GetLength();
src = new unsigned char [n];
for( i = 0; i < n; i++)
{
src[i] = inpt[i];
}
while( n > 0 && src[n-1] == '=')
{
src[n-1] = 0;
pad++;
n--;
}
for(i=0;i<n;i++)
{
p = (unsigned char *)strchr( (const char *)base64, (int)src[i]);
if(!p)
break;
src[i] = p-(unsigned char *)base64;
}
dst = (unsigned char *)malloc( n*3/4+1);
memset( dst, 0, n*3/4 +1);
for( i = 0,j = 0; i < n; i += 4,j += 3)
{
dst[j] = (src[i] << 2) + ((src[i+1] & 0x30) >> 4);
dst[j+1]=((src[i+1] & 0x0F) << 4) + ((src[i+2] & 0x3C) >> 2);
dst[j+2]=((src[i+2] & 0x03) << 6) + src[i+3];
*len += 3;
}
*len -= pad;
return CString(dst);
}
源码下载: http://yunpan.cn/Qt4AJxziqKMTV