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

  • Post author:
  • Post category:其他


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;

}



版权声明:本文为qq_24977505原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。