Base64是个很简单的将数据编码为可见字符的算法。就是将原始数据每6个位取出来,找一个可见字符代替,这样4个可见字符刚好可以代替原来的3个字节,原理不多说,直接上代码。
PS:代码只实现对可见字符的加解密,不可打印的还要修改。
#include <string>
using namespace std;
string Code("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
string Base64Encode(string data)
{
size_t len = data.size() / 3;
string out;
const unsigned char* input = (unsigned char*)data.data();
for (size_t i = 0; i < len; i++){
out += Code[input[0] >> 2];
out += Code[((input[0] & 0x03) << 4 )+ (input[1] >> 4)];
out += Code[((input[1] & 0x0f) << 2) + (input[2] >> 6)];
out += Code[input[2] & 0x3f];
input += 3;
}
len = data.size();
if (len % 3 == 1) {
out += Code[input[0] >> 2];
out += Code[(input[0] & 0x03) << 4];
out += "==";
}
else if (len % 3 == 2) {
out += Code[input[0] >> 2];
out += Code[((input[0] & 0x03) << 4) + (input[1] >> 4)];
out += Code[(input[1] & 0x0f) << 2];
out += "=";
}
return out;
}
unsigned char GetBaseValue(char data)
{
if (data > 'a' - 1) {
return data - 'a' + 26;
}
else if (data > 'A' - 1) {
return data - 'A';
}
else if (data > '0' - 1) {
return data - '0' + 52;
}
else if (data == '+') {
return 62;
}
else if (data == '/') {
return 63;
}
return 0;
}
string Base64Decode(string data)
{
string out;
unsigned char value[4];
size_t len = data.size() / 4 - 1;
const unsigned char* input = (unsigned char*)data.data();
for (size_t i = 0; i < len; i++) {
value[0] = GetBaseValue(input[0]);
value[1] = GetBaseValue(input[1]);
value[2] = GetBaseValue(input[2]);
value[3] = GetBaseValue(input[3]);
input += 4;
out.push_back((value[0] << 2) + (value[1] >> 4));
out.push_back((value[1] << 4) + (value[2] >> 2));
out.push_back((value[2] << 6) + value[3]);
}
value[0] = GetBaseValue(input[0]);
value[1] = GetBaseValue(input[1]);
out.push_back((value[0] << 2) + (value[1] >> 4));
if (input[2] != '=') {
value[2] = GetBaseValue(input[2]);
out.push_back((value[1] << 4) + (value[2] >> 2));
}
if (input[3] != '=') {
value[3] = GetBaseValue(input[3]);
out.push_back((value[2] << 6) + value[3]);
}
return out;
}