C++簡單實現Base64的編解碼

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章