闲暇时间写的,"解码字典"编码来源于网络(具体是哪篇文章不记得了,忘原作者见谅.),也许会有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;
}
//定义编码字典
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;
}
//Base64解码 --- 应该是编码吧
ULONG Base64_Encode(
多谢.这是一个BUG.不过我没办法改了,各位将就着看吧.
base64还明白。
解码字典:static WORD g_Base64_Decode_Table[]= { ....} 省略号表示的内容