关于自定义Base64编解码的实现

什么是Base64

Base64编码是将字符串以每3个8比特(bit)的字节子序列拆分成4个6比特(bit)的字节(6比特有效字节,最左边两个永远为0,其实也是8比特的字节)子序列,再将得到的子序列查找Base64的编码索引表,得到对应的字符拼接成新的字符串的一种编码方式。

每个3位8比特数据拆分成4个6比特数据过程如下图所示:

 

 

 注意事项

Base64编码后的数据大小必须是4的倍数,当转换后的数据大小不是4的倍数时可以用‘=’号或者其他符号代替。

代码实现

以下是我自定义的Base64编解码实现规则

编码部分

// 以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;
}

 

作者:a1557944原文地址:https://www.cnblogs.com/a1557944/p/17266792.html

%s 个评论

要回复文章请先登录注册