[原创]VC实现Base64编码范例

BOOL CEDCoder::EncodeBase64(const char *pszIn, int nInLen, char *pszOut, int nOutSize, int *nOutLen)
{
    ASSERT(pszIn);
    ASSERT(pszOut);
    ASSERT(nOutSize);
    ASSERT(nOutSize >= Base64BufferSize(nInLen));

    #ifndef _DEBUG
        nOutSize;
    #endif

    //初始化编码过程中的循环变量
        int nInPos = 0;
        int nOutPos = 0;
        int nLineLen = 0;
    //一次从源串中取得三个字符并编码
        for( int i=0 ; i<nInLen/3 ; i++)
        {
            //取得三个字符
            int c1 = pszIn[nInPos++]&0xFF;
            int c2 = pszIn[nInPos++]&0xFF;
            int c3 = pszIn[nInPos++]&0xFF;
            //将三个字符进行Base64编码
            pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
            pszOut[nOutPos++] = m_base64tab[((c1&0x03)<<4)|((c2&0xF0)>>4)];
            pszOut[nOutPos++] = m_base64tab[((c2&0x0F)<<2)|((c3&0xC0)>>6)];
            pszOut[nOutPos++] = m_base64tab[c3&0x3F];
            nLineLen += 4;
            //处理行数越界的情况
            if(nLineLen >= BASE64_MAXLINE-3)
            {
                char* cp = EOL;
                pszOut[nOutPos++] = *cp++;
                if(*cp)
                    pszOut[nOutPos++] = *cp;
                nLineLen = 0;
            }
        }
        //处理剩余的1或2个字符
        char* cp;
        switch(nInLen%3)
        {
        case 0:
            {
                cp = EOL;
                pszOut[nOutPos++] = *cp++;
                if(*cp)
                    pszOut[nOutPos] = *cp;
                break;
            }
        case 1:
            {
                int c1 = pszIn[nInPos]&0xFF;
                pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
                pszOut[nOutPos++] = m_base64tab[(c1&0x03)<<4];
                pszOut[nOutPos++] = '=';
                pszOut[nOutPos++] = '=';
                cp = EOL;
                pszOut[nOutPos++] = *cp++;
                if(*cp)
                    pszOut[nOutPos++] = *cp;
                break;
            }
        case 2:
            {
                int c1 = pszIn[nInPos++]&0xFF;
                int c2 = pszIn[nInPos]&0xFF;
                pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
                pszOut[nOutPos++] = m_base64tab[((c1&0x03)<<4)|((c2&0xF0)>>4)];
                pszOut[nOutPos++] = m_base64tab[(c2&0x0F)<<2];
                pszOut[nOutPos++] = '=';
                cp = EOL;
                pszOut[nOutPos++] = *cp++;
                if(*cp)
                    pszOut[nOutPos++] = *cp;
                break;
            }
        default:
            {
                //出错了!!
                ASSERT(FALSE);
                break;
            }
        }

        pszOut[nOutPos] = 0;
        *nOutLen = nOutPos;

    return TRUE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值