关于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;
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理