2
头图

什么是base64?


根据维基百科,base64是一种编码方式,将二进制数据表示为ASCII纯文本形式。(注意:base64不是加密算法,只是一种编码方式!)
如果用base64加密:

作用

电子邮件刚问世的时候,只能传输英文,但后来随着用户的增加,中文、日文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理,因此base64就登场了,base64可以在任何支持ASCII的地方传输文件,不用担心文件应为编解码的问题而损坏。

原理

base64选区了64个ASCII可见字符作为底(64的由来)将二进制数据映射到这64个字符上。
e34a76f1-80af-44b9-8d6c-f9baf7b986e4.png
例如:
原数据: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;
}

Bateman
6 声望1 粉丝

引用和评论

0 条评论