一、Base64簡介
二、字符串轉Base64原理
轉換的時候,將三個byte的數據,先後放入一個24bit的緩衝區中,先來的byte佔高位。數據不足3byte的話,於緩衝區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇
中的字符作爲編碼後的輸出。不斷進行,直到全部輸入數據轉換完成。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
如果最後剩下兩個輸入數據,在編碼結果後加1個“=”;如果最後剩下一個輸入數據,編碼結果後加2個“=”;如果沒有剩下任何數據,就什麼都不要加,這樣纔可以保證資料還原的正確性。
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';
}
}
參考資料: