什么是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编码。
注意,若原二进制数据不满6位,则用0补全,最后若编码后的字节数不是4的倍数,再用=号补满4个字节。
解码的过程完全就是将编码过程反过来,不过多赘述。
附上简单的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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。