//////////////////////////////////////////////////////////////////////////
//
//    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;
}
Posted on 2006-02-26 22:26  RainVan  阅读(747)  评论(1)    收藏  举报