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