共计 1639 个字符,预计需要花费 5 分钟才能阅读完成。
什么是 base64?
依据维基百科,base64 是一种编码方式,将二进制数据表示为 ASCII 纯文本模式。(留神:base64 不是加密算法,只是一种编码方式!)
如果用 base64 加密:
作用
电子邮件刚问世的时候,只能传输英文,但起初随着用户的减少,中文、日文等文字的用户也有需要,但这些字符并不能被服务器或网关无效解决,因而 base64 就退场了,base64 能够在任何反对 ASCII 的中央传输文件,不必放心文件应为编解码的问题而损坏。
原理
base64 选区了 64 个 ASCII 可见字符作为底(64 的由来)将二进制数据映射到这 64 个字符上。
例如:
原数据:abc
abc 对应的 ASCII 地位就是 97,98,99。示意位二进制模式就是:
01100001 01100010 01100010
再将二进制数据以每 6 位一组:
011000 010110 001001 100010
对应的 10 进制别离为:
24 22 9 34
依据下面的 base64 表查表的
YWJi
至此,就实现了对 abc
的 base64 编码
解码的过程齐全就是将编码过程反过来,不过多赘述。
附上简略的 cpp 实现:
#include <iostream>
#include <string>
using namespace std;
class Base64
{
private:
static constexpr const char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static uint8_t index_of (char encoded_char)
{for (int i = 0; i < 64; i++) {if (encoded_char == base64_chars[i]) return i;
}
return 64;
}
public:
static string encode (string origin)
{
int buf = 0;
int buf_size = 0;
string result;
for (int origin_char : origin) {buf = (buf << 8) + origin_char;
buf_size += 8;
while (buf_size >= 6) {uint8_t base64_index = (buf >> (buf_size - 6));
buf = buf ^ ((buf >> (buf_size - 6)) << (buf_size - 6));
buf_size -= 6;
result.push_back(base64_chars[base64_index]);
}
}
if (buf_size > 0 && buf_size < 6) {uint8_t base64_index_offset = buf << (6 - buf_size);
result.push_back(base64_chars[base64_index_offset]);
}
return result;
}
static string decode (string encoded)
{
unsigned buf = 0;
unsigned buf_size = 0;
string result;
for (char encoded_char : encoded) {if (encoded_char == '=') break;
uint8_t index = index_of(encoded_char);
buf = (buf << 6) + index;
buf_size += 6;
while (buf_size >= 8) {result.push_back((char) (buf >> (buf_size - 8)));
buf_size -= 8;
}
}
return result;
}
};
int main () {
Base64 base64;
string o = "zixiao is handsome";
string encoded = base64.encode(o);
string decoded = base64.decode(encoded);
cout << decoded << endl;
return 0;
}
正文完