什么是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; }