字符串轉base64

一、Base64簡介

Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基於用64個可打印字符來表示二進制數據的表示方法。它通常用作存儲、傳輸一些二進制數據編碼方法!也是MIME(多用途互聯網郵件擴展,主要用作電子郵件標準)中一種可打印字符表示二進制數據的常見編碼方法!它其實只是定義用可打印字符傳輸內容一種方法,並不會產生新的字符集!
0~63對應到ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

二、字符串轉Base64原理

轉換的時候,將三個byte的數據,先後放入一個24bit的緩衝區中,先來的byte佔高位。數據不足3byte的話,於緩衝區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
中的字符作爲編碼後的輸出。不斷進行,直到全部輸入數據轉換完成。

如果最後剩下兩個輸入數據,在編碼結果後加1個“=”;如果最後剩下一個輸入數據,編碼結果後加2個“=”;如果沒有剩下任何數據,就什麼都不要加,這樣纔可以保證資料還原的正確性。



三、C++代碼實現
思路:
第一個輸出字節:取第一輸入字節的前6位,並且在高位補0,使其變成8位(一個字節)
第二個輸出字節:取第一輸入字節的後2位和第二個輸入字節的前4位(共6位),並且在高位補0,使其變成8位(一個字節)
第三個輸出字節:取第二輸入字節的後4位和第三個輸入字節的前2位(共6位),並且在高位補0,使其變成8位(一個字節)
第四個輸出字節:取第三輸入字節的後6位,並且在高位補0,使其變成8位(一個字節)

char* src = "ABC";
int len = strlen(src);
int nLeft = 3 - len % 3;
char* dst = (char*)malloc((len+nLeft) * 4 / 3 + 1);
str2base64(src, dst);
cout << dst << endl;

轉換函數:

void str2base64(char* src, char* dst)
{
        static char base64Index[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

        int len = strlen(src);
        int nLeft = 3 - len % 3;
        char e[4];
        int i, j;

        for (i = 0, j = 0;i < (len - len % 3); i+=3, j+=4)
        {
                e[0] = src[i] >> 2;
                e[1] = (src[i] & 0x03) << 4 | (src[i + 1] >> 4);
                e[2] = (src[i + 1] & 0x0f) << 2 | (src[i + 2] >> 6);
                e[3] = src[i + 2] & 0x3f;

                dst[j    ] = base64Index[e[0]];
                dst[j + 1] = base64Index[e[1]];
                dst[j + 2] = base64Index[e[2]];
                dst[j + 3] = base64Index[e[3]];
        }

        if (nLeft == 2)
        {
                e[0] =  src[i] >> 2;
                e[1] = (src[i] & 0x03) << 4;

                dst[j] = base64Index[e[0]];
                dst[j + 1] = base64Index[e[1]];
                dst[j + 2] = dst[j + 3] = '=';

                dst[j + 4] = '\0';
        }
        else if(nLeft == 1)
        {
                e[0] =  src[i] >> 2;
                e[1] = (src[i] & 0x03) << 4 | (src[i + 1] >> 4);
                e[2] =  (src[i + 1] & 0x0f) << 2;

                dst[j    ] = base64Index[e[0]];
                dst[j + 1] = base64Index[e[1]];
                dst[j + 2] = base64Index[e[2]];
                dst[j + 3] = '=';

                dst[j + 4] = '\0';
        }
        else
        {
                dst[j] = '\0';
        }
}

參考資料:
---


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章