//////////////////////////////////////////////////////////////////////////
//
// Author: RainVan(XiaoYunFeng)
// Description: Base64 Encode
//
//////////////////////////////////////////////////////////////////////////
int Base64_Enc(char *pcBuf,const char *pcTxt,int nTxtlen)
{
const unsigned char Base64_EnCoding[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int nBuflen = 0;
unsigned char *pt = (unsigned char *)pcTxt;
/* nTxtlen 小于 0,则自行计算 pcTxt 的长度 */
if( nTxtlen < 0 )
{
while( *pt++ ){ nTxtlen++; }
pt = (unsigned char *)pcTxt;
}
if( !nTxtlen ) return 0;
while( nTxtlen > 0 )
{
*pcBuf++ = Base64_EnCoding[ ( pt[0] >> 2 ) & 0x3f];
if( nTxtlen > 2 )
{
*pcBuf++ = Base64_EnCoding[((pt[0] & 3) << 4) | (pt[1] >> 4)];
*pcBuf++ = Base64_EnCoding[((pt[1] & 0xF) << 2) | (pt[2] >> 6)];
*pcBuf++ = Base64_EnCoding[ pt[2] & 0x3F];
}
else
{
switch( nTxtlen )
{
case 1:
*pcBuf++ = Base64_EnCoding[(pt[0] & 3) << 4 ];
*pcBuf++ = '=';
*pcBuf++ = '=';
break;
case 2:
*pcBuf++ = Base64_EnCoding[((pt[0] & 3) << 4) | (pt[1] >> 4)];
*pcBuf++ = Base64_EnCoding[((pt[1] & 0x0F) << 2) | (pt[2] >> 6)];
*pcBuf++ = '=';
}
}
pt += 3;
nTxtlen -= 3;
nBuflen += 4;
}
*pcBuf = 0;
return nBuflen;
}
//////////////////////////////////////////////////////////////////////////
//
// Author: RainVan(XiaoYunFeng)
// Description: Base64 Decode
//
//////////////////////////////////////////////////////////////////////////
int Base64_Dec(char *pcBuf,const char *pcTxt,int nTxtlen)
{
unsigned char ucs[4];
char *pt = (char *)pcTxt;
int nBuflen = 0 , nfag = 0 , i = 0;
/* nTxtlen 小于 0,则自行计算 pcTxt 的长度 */
if( nTxtlen < 0 )
{
while( *pt++ ){ nTxtlen++; }
pt = (unsigned char *)pcTxt;
}
if( !nTxtlen ) return 0;
while( nTxtlen > 0 )
{
nfag = 0;
for( i=0 ; i<4 ; i++ )
{
if (*pt >= 'A' && *pt <= 'Z')
ucs[i] = *pt - 'A';
else if (*pt >= 'a' && *pt <= 'z')
ucs[i] = *pt - 'a' + 26;
else if (*pt >= '0' && *pt <= '9')
ucs[i] = *pt - '0' + 52;
else{
switch (*pt)
{
case '+':
ucs[i] = 62;
break;
case '/':
ucs[i] = 63;
break;
case '=': /* base64 padding */
ucs[i] = 0;
break;
case '\t':
case '\r':
case '\n':
case ' ':
nfag++;
i--;
break;
case '\0': /* 遇到文尾,直接返回上次字符 buf 的长度 */
*pcBuf = 0;
return nBuflen;
break;
default: /* 遇到其它非法字符,直接返回 */
*pcBuf = 0;
return -1;
}
}
pt++;
}
*pcBuf++ = (ucs[0] << 2) | (ucs[1] >> 4);
*pcBuf++ = (ucs[1] << 4) | (ucs[2] >> 2);
*pcBuf++ = (ucs[2] << 6) | (ucs[3]);
nTxtlen -= nfag + 4;
nBuflen += 3;
}
*pcBuf = 0;
//返回 buf 长度
return nBuflen;
}
浙公网安备 33010602011771号