一、base64编码
base64是一种编码格式,将3个8位字节(3*8 = 24)转换为(4*6 = 24),之后每个6位前面补充两个0,形成8位,如果字符串不能整除3,即余数为1的话,补充4位0,构成12位(12 = 1*8+4);余数为2的话,补充2,构成18位(18=2*8+2),结尾用“=”标识。
二、base64位常量字符
//base64就是使用64个可打印的字符,表示二进制的方法
//把3个8位字节(3*8 = 24)转化成4个6位的字节方法
//结尾"="
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
三、base64编码的具体实现
#ifndef _BASE64_H
#define _BASE64_H
#include <string>
//base64就是使用64个可打印的字符,表示二进制的方法
//把3个8位字节(3*8 = 24)转化成4个6位的字节方法
//结尾"="
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
static inline bool IsBase64(unsigned char c) {
return (isalnum(c) || (c == '+') || (c == '/'));
}
std::string Base64Encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
std::string ret;
int i = 0;
int j = 0;
//定义char字符数组3
unsigned char char_array_3[3];
//定义char字符数组4
unsigned char char_array_4[4];
//处理是3的倍数的字符
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (3 == i) {
//0xfc = 252 = 11111100
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
//1、先得到char_array_3[0]的后两位 00000011 ,然后左移动4位
//2、在得到char_array_3[1]的前4位 然后右动4位
//3、两者相加得到最后结果
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
//1、先得到char_array_3[1]的后4位,然后左移动2位
//2、先得到char_array_3[2]的前两位,右移4位
//3、两者相加得到结果
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
//获取char_array_3[2]的后6位
char_array_4[3] = char_array_3[2] & 0x3f;
//
for (i = 0; (i < 4); i++)
ret += base64_chars[char_array_4[i]];
i = 0;
}
}
//处理剩余的字符
if (i) {
for (j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j < i + 1); j++)
ret += base64_chars[char_array_4[j]];
while ((i++ < 3))
ret += '=';
}
return ret;
}
std::string Base64Decode(std::string const& encoded_string) {
std::size_t in_len = encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
std::string ret;
while (in_len-- && (encoded_string[in_] != '=') && IsBase64(encoded_string[in_])) {
char_array_4[i++] = encoded_string[in_];
in_++;
if (4 == i) {
for (i = 0; i < 4; i++)
char_array_4[i] = base64_chars.find(char_array_4[i]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (i = 0; (i < 3); i++)
ret += char_array_3[i];
i = 0;
}
}
if (i) {
for (j = i; j < 4; j++)
char_array_4[j] = 0;
for (j = 0; j < 4; j++)
char_array_4[j] = base64_chars.find(char_array_4[j]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (j = 0; (j < i - 1); j++)
ret += char_array_3[j];
}
return ret;
}
#endif //#define _BASE64_H