C++简单实现Base64的编解码

不问归期 提交于 2019-12-31 17:54:58

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!