BOOL EncodeBase64(
LPBYTE lpDes,
DWORD dwDesLen,
const LPBYTE lpSrc,
DWORD dwSrcLen)
{
if( (dwDesLen/4) < (dwSrcLen/3))
return FALSE;
DWORD len = dwSrcLen/3; //循环次数
LPBYTE lpBufSrc = NULL;
LPBYTE lpBufDes = NULL;
//不论是否是3的倍数,都加1
lpBufSrc = new BYTE [ 3*(len+1)+1 ] ;
lpBufDes = new BYTE [ 4*(len+1)+1 ] ;
memset( lpBufSrc, 0, 3*(len+1)+1);
memset( lpBufDes, 0, 4*(len+1)+1);
memcpy(lpBufSrc, lpSrc, dwSrcLen);
LPBYTE lpTmpSrc = lpBufSrc;
LPBYTE lpTmpDes = lpBufDes;
int nAddress = 0;
//先转换3的倍数里的数据
for( DWORD i=0; i<len; i++)
{
nAddress = *lpTmpSrc >> 2;
*lpTmpDes = base64_alphabet[nAddress];
nAddress = (*lpTmpSrc & 0x3) ;
nAddress = nAddress << 4;
nAddress += (*(lpTmpSrc+1)&0xf0) >> 4;
*(lpTmpDes+1) = base64_alphabet[nAddress];
nAddress = ( *(lpTmpSrc+1)&0xf) << 2;
nAddress += *(lpTmpSrc+2) >> 6;
*(lpTmpDes+2) = base64_alphabet[nAddress];
nAddress = *(lpTmpSrc+2)&0x3f;
*(lpTmpDes+3) = base64_alphabet[nAddress];
lpTmpDes += 4;
lpTmpSrc += 3;
}
//若不是 3 的倍数,再考虑余下的 2 位
if( 0!=dwSrcLen%3)
{
nAddress = *lpTmpSrc >> 2;
*lpTmpDes = base64_alphabet[nAddress];
nAddress = (*lpTmpSrc & 0x3) ;
nAddress = nAddress << 4;
nAddress += (*(lpTmpSrc+1)&0xf0) >> 4;
*(lpTmpDes+1) = base64_alphabet[nAddress];
switch( dwSrcLen%3)
{
case 2:
nAddress = ( *(lpTmpSrc+1)&0xf) << 2;
nAddress += *(lpTmpSrc+2) >> 6;
*(lpTmpDes+2) = base64_alphabet[nAddress];
break;
case 1:
*(lpTmpDes+2) = '=';
break;
}
*(lpTmpDes+3) = '=';
}
memcpy(lpDes, lpBufDes, dwDesLen) ;
delete [] lpBufSrc;
delete [] lpBufDes;
return TRUE;
}
{
if( (dwDesLen/4) < (dwSrcLen/3))
return FALSE;
DWORD len = dwSrcLen/3; //循环次数
LPBYTE lpBufSrc = NULL;
LPBYTE lpBufDes = NULL;
//不论是否是3的倍数,都加1
lpBufSrc = new BYTE [ 3*(len+1)+1 ] ;
lpBufDes = new BYTE [ 4*(len+1)+1 ] ;
memset( lpBufSrc, 0, 3*(len+1)+1);
memset( lpBufDes, 0, 4*(len+1)+1);
memcpy(lpBufSrc, lpSrc, dwSrcLen);
LPBYTE lpTmpSrc = lpBufSrc;
LPBYTE lpTmpDes = lpBufDes;
int nAddress = 0;
//先转换3的倍数里的数据
for( DWORD i=0; i<len; i++)
{
nAddress = *lpTmpSrc >> 2;
*lpTmpDes = base64_alphabet[nAddress];
nAddress = (*lpTmpSrc & 0x3) ;
nAddress = nAddress << 4;
nAddress += (*(lpTmpSrc+1)&0xf0) >> 4;
*(lpTmpDes+1) = base64_alphabet[nAddress];
nAddress = ( *(lpTmpSrc+1)&0xf) << 2;
nAddress += *(lpTmpSrc+2) >> 6;
*(lpTmpDes+2) = base64_alphabet[nAddress];
nAddress = *(lpTmpSrc+2)&0x3f;
*(lpTmpDes+3) = base64_alphabet[nAddress];
lpTmpDes += 4;
lpTmpSrc += 3;
}
//若不是 3 的倍数,再考虑余下的 2 位
if( 0!=dwSrcLen%3)
{
nAddress = *lpTmpSrc >> 2;
*lpTmpDes = base64_alphabet[nAddress];
nAddress = (*lpTmpSrc & 0x3) ;
nAddress = nAddress << 4;
nAddress += (*(lpTmpSrc+1)&0xf0) >> 4;
*(lpTmpDes+1) = base64_alphabet[nAddress];
switch( dwSrcLen%3)
{
case 2:
nAddress = ( *(lpTmpSrc+1)&0xf) << 2;
nAddress += *(lpTmpSrc+2) >> 6;
*(lpTmpDes+2) = base64_alphabet[nAddress];
break;
case 1:
*(lpTmpDes+2) = '=';
break;
}
*(lpTmpDes+3) = '=';
}
memcpy(lpDes, lpBufDes, dwDesLen) ;
delete [] lpBufSrc;
delete [] lpBufDes;
return TRUE;
}