什麼是Base64 Base64編碼是將字元串以每3個8比特(bit)的位元組子序列拆分成4個6比特(bit)的位元組(6比特有效位元組,最左邊兩個永遠為0,其實也是8比特的位元組)子序列,再將得到的子序列查找Base64的編碼索引表,得到對應的字元拼接成新的字元串的一種編碼方式。 每個3位8比特數據拆分成 ...
什麼是Base64
Base64編碼是將字元串以每3個8比特(bit)的位元組子序列拆分成4個6比特(bit)的位元組(6比特有效位元組,最左邊兩個永遠為0,其實也是8比特的位元組)子序列,再將得到的子序列查找Base64的編碼索引表,得到對應的字元拼接成新的字元串的一種編碼方式。
每個3位8比特數據拆分成4個6比特數據過程如下圖所示:
註意事項
Base64編碼後的數據大小必須是4的倍數,當轉換後的數據大小不是4的倍數時可以用‘=’號或者其他符號代替。
代碼實現
以下是我自定義的Base64編解碼實現規則
編碼部分
const char base64_table[] = "在此添加自定義base64編碼規則"; std::string encode(std::string &src) { char encodeData[10000000];// 以3個位元組為一組 int data_len = src.length() / 3; // std::cout << src.length() << std::endl; // src的餘數數據 int data_add = src.length() % 3; int temp = 0; int tmp = 0; int n = 0; while (temp < data_len) { encodeData[n++] = base64_table[src[tmp] >> 2]; encodeData[n++] = base64_table[(src[tmp] & 0x3) << 4 | src[tmp + 1] >> 4]; encodeData[n++] = base64_table[(src[tmp + 1] & 0x0f) << 2 | src[tmp + 2] >> 6]; encodeData[n++] = base64_table[src[tmp + 2] & 0x3f]; tmp += 3; temp++; } // 餘數為1,需要補齊2個= if (data_add == 1) { encodeData[n++] = base64_table[src[tmp] >> 2]; encodeData[n++] = base64_table[(src[tmp] & 0x3) << 4]; encodeData[n++] = '='; encodeData[n++] = '='; encodeData[n] = '\0'; } // 餘數為2,需要補齊1個= else if (data_add == 2) { encodeData[n++] = base64_table[src[tmp] >> 2]; encodeData[n++] = base64_table[(src[tmp] & 0x3) << 4 | src[tmp + 1] >> 4]; encodeData[n++] = base64_table[(src[tmp + 1] & 0xf) << 2]; encodeData[n++] = '='; encodeData[n] = '\0'; } else { encodeData[n] = '\0'; } return std::string(encodeData); }
解碼部分
std::string decode(std::string &src) { // 自定義base64解碼表,以ASCII碼值順序存儲,對應base64編碼表 const char decode_base64_table[] = {“自定義128位base64解碼規則,以1128位ASCII碼的順序存儲base64編碼表中對應字元的位置”}; int inputLen = src.length(); // 計算解碼後的數據長度 int outputLen = inputLen / 4 * 3; unsigned buf = 0; unsigned bufSize = 0; if (inputLen % 4 == 0) { if (src[inputLen - 1] == '=') outputLen--; if (src[inputLen - 2] == '=') outputLen--; } else { switch (inputLen % 4) { case 1: throw std::invalid_argument("invalid input-1"); return nullptr; case 2: outputLen++; break; case 3: outputLen += 2; break; } } std::string output(outputLen, '\0'); int i = 0; for (uint8_t c : src) { if (c > 127 || c == '=') break; uint8_t sextet = decode_base64_table[c]; if (sextet == 64) { throw std::invalid_argument("invalid base64 input-2"); return nullptr; } buf = (buf << 6) + sextet; bufSize += 6; if (bufSize >= 8) { output[i++] = (buf >> (bufSize - 8)); bufSize -= 8; } } return output; }