什么是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; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548463.html
標籤:其他
上一篇:Django筆記十之values_list指定欄位取值及distinct去重處理
下一篇:day01-專案介紹和功能實作
