乐趣区

关于base64:base64原理

什么是 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;
}
退出移动版