一、base64转换
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,剩下的bit用0补足。
然后,每次取出6(因为26 = 64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。
如果最後剩下兩個輸入數據,在編碼結果後加1個「=」;如果最後剩下一個輸入數據,編碼結果後加2個「=」;如果沒有剩下任何數據,就什麼都不要加。
二、代码
#include <iostream> #include <string.h> using namespace std; const char base[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ/ abcdefghijklmnopqrstuvwxyz/ 0123456789+/"; string encode(const char * str, int len) { int len2 = (len + 2) / 3 * 4; char ret[len2 + 1]; int i = 0; for(i = 0; i < len - 2; i = i + 3) { int j = i * 4 / 3; ret[j] = base[str[i] >> 2]; ret[j + 1] = base[((str[i] & 0x03) << 4) + (str[i + 1] >> 4)]; ret[j + 2] = base[((str[i + 1] & 0x0F) << 2) + (str[i + 2] >> 6)]; ret[j + 3] = base[str[i + 2] & 0x3F]; } if(i < len) { int j = i * 4 / 3; ret[j] = base[str[i] >> 2]; ret[j + 1] = base[(str[i + 1] >> 4) + (((str[i] << 6) & 0xFF) >> 2)]; ret[j + 2] = base[(str[i + 1] << 4 & 0xFF) >> 2]; int k = len - i; while(k < 3) { k++; ret[j + k] = '='; } } ret[len2] = '/0'; return ret; } int main() { string str = "hello world!"; cout << encode(str.c_str(), str.length()) << endl; return 0; }