闲暇时间写的,"解码字典"编码来源于网络(具体是哪篇文章不记得了,忘原作者见谅.),也许会有BUG,如果使用请仔细测试.static TCHAR g_EqualsSign = _T('=');
//定义编码字典
static TCHAR g_Base64_Encode_Table[] = {_T("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")};//定义解码字典
static WORD  g_Base64_Decode_Table[] = 

64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, 
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62,64,64,64,63, 
52,53,54,55,56,57,58,59,60,61,64,64,64,64,64,64,64,0,1,2,3,4,5,6,7,8,9, 
10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,64,64,64,64,64,64,26,27, 
28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51, 
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, 
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, 
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, 
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, 
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, 
64,64,64,64,64,64,64,64,64,64,64,64,64 
}; 
//编码
ULONG __Base64_Encode(const BYTE * pData,ULONG nDataSize,LPTSTR lpszBuffer,ULONG nBufferSize)
{
ULONG nResult = 0;

ULONG nCount = nDataSize / 3;
ULONG nRemain = nDataSize % 3;
ULONG nFormal = nDataSize - nRemain;
UINT nMark = 0; //1:先计算整数位 
for( ULONG n = 0 ; n < nFormal ; n += 3 )
{

//每次取三个字节
//10101010 01010101 00001111

//1: 00000000 00000000 00000000 10101010 
nMark = pData[n];
//2: 00000000 00000000 10101010 01010101
nMark = (nMark << 8 |pData[n+1]);
//3: 00000000 10101010 01010101 00001111
nMark = (nMark << 8 |pData[n+2]);

//每次取六位(引号中间的部分)
//1: 00000000 '101010'10 01010101 00001111 & 00FC0000 = 101010 
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x00FC0000) >> 18];
//2: 00000000 101010'10 0101'0101 00001111 & 0003F000 = 100101 
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x0003F000) >> 12];
//3: 00000000 10101010 0101'0101 00'001111 & 00000FC0 = 0101 00 
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x00000FC0) >> 6];
//4: 00000000 10101010 01010101 00'001111' & 0000003F = 001111
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0X0000003F) >> 0];
}

//2:计算余数位 //余两个字节
if( nRemain == 2 )
{ //只余两个字节
//10101010 01010101 

//1: 00000000 00000000 00000000 10101010 
nMark = pData[nFormal];
//2: 00000000 00000000 10101010 01010101
nMark = (nMark << 8 |pData[nFormal+1]);
//3: 00000000 10101010 01010101 00000000 (补0)
nMark = (nMark << 8 |0);

//每次取六位(引号中间的部分)
//1: 00000000 '101010'10 01010101 00000000 & 00FC0000 = 101010 
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x00FC0000) >> 18];
//2: 00000000 101010'10 0101'0101 00000000 & 0003F000 = 10 0101
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x0003F000) >> 12];
//3: 00000000 10101010 0101'0101 00'000000  & 00000FC0 = 0101 00
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x00000FC0) >> 6];
//4: 末尾补 '='
lpszBuffer[nResult++] = g_EqualsSign;
} //余一个字节
if( nRemain == 1 )
{ //只余一个字节
//10101010 
nMark = pData[nFormal];
//2: 00000000 00000000 10101010 00000000 (补0)
nMark = (nMark << 8 | 0);
//3: 00000000 10101010 00000000 00000000 (补0 0)
nMark = (nMark << 8 | 0); //每次取六位(引号中间的部分)
//1: 00000000 '101010'10 00000000 00000000  & 00FC0000 = 101010 
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x00FC0000) >> 18];
//2: 00000000 101010'10 0000'0000 00000000  & 0000000F = 10 0000
lpszBuffer[nResult++] = g_Base64_Encode_Table[(nMark & 0x0003F000) >> 12];
//3: 末尾补 '='
lpszBuffer[nResult++] = g_EqualsSign;
//4: 末尾补 '='
lpszBuffer[nResult++] = g_EqualsSign;
}
return nResult;
}//解码
ULONG __Base64_Decode(LPCTSTR lpszString,ULONG nStringSize,BYTE * lpBuffer,ULONG nBufferSize)
{
ULONG nResult = 0;

ULONG nFormal = nStringSize - 4;
UINT nMark = 0;
//
for ( ULONG n = 0 ; n < nFormal ; n+=4 )
{ //每次取四个字符
// a = 26,b = 27,c = 28,d = 28  (在解码表中的) //1: a  
nMark = g_Base64_Decode_Table[lpszString[n]];
//2: a b 
nMark = ( nMark<<6 | g_Base64_Decode_Table[lpszString[n+1]] );
//3: a b c
nMark = ( nMark<<6 | g_Base64_Decode_Table[lpszString[n+2]] );
//4: a b c d 
nMark = ( nMark<<6 | g_Base64_Decode_Table[lpszString[n+3]] );

//取三个有效字节
//1:
lpBuffer[nResult++] = (BYTE)(nMark >> 16 & 0x000000FF);
//2:
lpBuffer[nResult++] = (BYTE)(nMark >> 8 & 0x000000FF);
//3:
lpBuffer[nResult++] = (BYTE)(nMark >> 0 & 0x000000FF);
}

//计算末尾四个字符
// a b c = ; a b = =  //1:   
nMark = g_Base64_Decode_Table[lpszString[nFormal]];
//2:  
nMark = ( nMark<<6 | g_Base64_Decode_Table[lpszString[nFormal+1]] );
//3
if( lpszString[n+2] != g_EqualsSign)
nMark = ( nMark << 6 | g_Base64_Decode_Table[lpszString[nFormal+2]] );
else
nMark = ( nMark << 6 );
//4:  
if( lpszString[n+3] != g_EqualsSign)
nMark = ( nMark << 6 | g_Base64_Decode_Table[lpszString[nFormal+3]] );
else
nMark = ( nMark << 6 ); //取有效字节
//1:
lpBuffer[nResult++] = (BYTE)(nMark >> 16 & 0x000000FF);
//2:
if( lpszString[n+2] != g_EqualsSign )
lpBuffer[nResult++] = (BYTE)(nMark >> 8 & 0x000000FF);
//3:
if( lpszString[n+3] != g_EqualsSign )
lpBuffer[nResult++] = (BYTE)(nMark >> 0 & 0x000000FF);
return nResult;
}
//Base64解码
ULONG Base64_Encode(const BYTE * pData,ULONG nDataSize,LPTSTR lpszBuffer,ULONG nBufferSize)
{
ULONG nResult = 0; if( pData && nDataSize > 0 && lpszBuffer && nBufferSize > 0  )
{
//计算所需空间是否足够
ULONG nNeedSize = (nDataSize/3*4+ ((nDataSize%3==0)?0:4)) ; if( nBufferSize >= nNeedSize  )
{
nResult = ::__Base64_Encode(pData,nDataSize,lpszBuffer,nBufferSize);
}
} return nResult;
}//Base64解码
ULONG Base64_Decode(LPCTSTR lpszString,ULONG nStringSize,BYTE * lpBuffer,ULONG nBufferSize)
{
ULONG nResult = 0; //最少有四个字符
if( lpszString && nStringSize >= 4 && ((nStringSize%4) == 0) && lpBuffer && nBufferSize > 0 )
{
//计算所需空间是否足够  //先计算必须的
ULONG nNeedSize = (nStringSize - 4) / 4 * 3;

//(检测末尾是否有补齐字符 '=' )
if( (lpszString[nStringSize-2] == g_EqualsSign) )
nNeedSize += 1;
else if( (lpszString[nStringSize-1] == g_EqualsSign) )
nNeedSize += 2;
else
nNeedSize += 3; if( nBufferSize >= nNeedSize )
{
nResult = ::__Base64_Decode(lpszString,nStringSize,lpBuffer,nBufferSize);
}
}

return nResult;
}