base64算法源碼c版

base64算法源碼c版

#include <stdio.h>    //注意哦,VC中""是當前路徑,<>是系統路徑  
#include <windows.h>  

const char BASE_CODE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  //base碼

//編碼,參數:要編碼的字符串指針,解碼後存放的位置(編碼字串長度的4/3),要編碼的字符串長度 
//->返回結果長度  
int fnBase64Encode(char *lpString, char *lpBuffer, int sLen) 
//參數:明文,緩衝區,明文長度  
{   register int vLen = 0;  //寄存器局部變量,提速  
    while(sLen > 0)      //處理整個字符串  
    {   *lpBuffer++ = BASE_CODE[(lpString[0] >> 2 ) & 0x3F];  //右移兩位,與00111111是防止溢出,自加  
        if(sLen > 2) //夠3個字符  
        {   *lpBuffer++ = BASE_CODE[((lpString[0] & 3) << 4) | (lpString[1] >> 4)];  
            *lpBuffer++ = BASE_CODE[((lpString[1] & 0xF) << 2) | (lpString[2] >> 6)];  
            *lpBuffer++ = BASE_CODE[lpString[2] & 0x3F];  
        }else  
        {   switch(sLen)    //追加“=”  
            {   case 1:  
                    *lpBuffer ++ = BASE_CODE[(lpString[0] & 3) << 4 ];  
                    *lpBuffer ++ = '=';  
                    *lpBuffer ++ = '=';  
                    break;  
                case 2:  
                    *lpBuffer ++ = BASE_CODE[((lpString[0] & 3) << 4) | (lpString[1] >> 4)];  
                    *lpBuffer ++ = BASE_CODE[((lpString[1] & 0x0F) << 2) | (lpString[2] >> 6)];  
                    *lpBuffer ++ = '=';  
                    break;  
            }  
        }  
        lpString += 3;  
        sLen -= 3;  
        vLen +=4;  
    }  
    *lpBuffer = 0;  
    return vLen;  
}  

//子函數 - 取密文的索引  
inline char GetCharIndex(char c) //內聯函數可以省去函數調用過程,提速  
{   if((c >= 'A') && (c <= 'Z'))  
    {   return c - 'A';  
    }else if((c >= 'a') && (c <= 'z'))  
    {   return c - 'a' + 26;  
    }else if((c >= '0') && (c <= '9'))  
    {   return c - '0' + 52;  
    }else if(c == '+')  
    {   return 62;  
    }else if(c == '/')  
    {   return 63;  
    }else if(c == '=')  
    {   return 0;  
    }  
    return 0;  
}  

//解碼,參數:結果,密文,密文長度  
int fnBase64Decode(char *lpString, char *lpSrc, int sLen)   //解碼函數  
{   static char lpCode[4];  
    register int vLen = 0;  
    if(sLen % 4)        //Base64編碼長度必定是4的倍數,包括'='  
    {   lpString[0] = '\0';  
        return -1;  
    }  
    while(sLen > 2)      //不足三個字符,忽略  
    {   lpCode[0] = GetCharIndex(lpSrc[0]);  
        lpCode[1] = GetCharIndex(lpSrc[1]);  
        lpCode[2] = GetCharIndex(lpSrc[2]);  
        lpCode[3] = GetCharIndex(lpSrc[3]);  

        *lpString++ = (lpCode[0] << 2) | (lpCode[1] >> 4);  
        *lpString++ = (lpCode[1] << 4) | (lpCode[2] >> 2);  
        *lpString++ = (lpCode[2] << 6) | (lpCode[3]);  

        lpSrc += 4;  
        sLen -= 4;  
        vLen += 3;  
    }  
    return vLen;  
}  

void main() //主函數,測試函數  
{   char s[] = "a", str[32];  
    int l = strlen(s);  
    int i = fnBase64Encode(s, str, l);  
    printf("fnBase64Encode(\"%s\", str, %d) = \"%s\";\n", s, l, str);  
    l = fnBase64Decode(s, str, i);  
    printf("fnBase64Decode(\"%s\", s, %d) = \"%s\";\n", str, i, s);  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章