005-libb64-base64编码

base64编码是一种用64个字符来表示任意二进制数据的方法,是用一个小集合(文本字符)表达一个大集合(二进制数据)的常用方法之一。

1750578951355

哪些数据是文本数据?

能够解释成人类制定的字符数据,就可以称为文本数据。假设有一个文件,它包含的数据只使用到字符数据,并且这些字符数据全部采用同一种编码方案,那么,习惯上这个文件就会被称为“纯文本文件”。

base64挑选了64个字符来表达所有的二进制数据,它们是:

  • 大小写字母:A-Z,a-z (52个)
  • 数字:0-9 (10个)
  • 加号:+ (1个)
  • 斜杠:/ (1个)

base64效果:

  1. 将数据转换为人类认识的字符所组成的数据;
  2. 能看懂但无法理解。

base64编码的作用:满足了某些程序在某些环节下某些数据只能用字符串表达的需求。

1750579827619

典型使用示例(c++)

#include <cstdlib>
#include <fstream>
#include <iostream>

#include <b64/decode.h>
#include <b64/encode.h>

void testInConsole()
{
    {
        std::cout << "b64::encode: " << std::endl;

        base64::encoder er;
        er.encode(std::cin, std::cout);
    }

    std::cin.clear();

    {
        std::cout << "b64::decode: " << std::endl;

        base64::decoder er;
        er.decode(std::cin, std::cout);
    }
}

class FileStatus {
public:
    std::ifstream ifs;
    std::ofstream ofs;

    bool OK() const
    {
        return ifs.good() && ofs.good();
    }
};

FileStatus OpenFiles(char const* in, char const* out, char const* mode)
{
    FileStatus r;

    r.ifs.open(in, std::ios::binary | std::ios::in);
    if (!r.ifs) {
        throw std::runtime_error("Failed to open input file");
        return r;
    }

    r.ofs.open(out, std::ios::binary | std::ios::out);
    if (!r.ofs) {
        throw std::runtime_error("Failed to open output file");
        return r;
    }

    return r;
}

void testFile()
{
    {
        char const* job = "encode";
        char const* in = "C:\\Users\\WDJ\\Desktop\\02-insect-award-winner_jose-miguel-gallego-molina_mantis-flamenca.webp";
        char const* out = "./base64.txt";

        FileStatus fs = OpenFiles(in, out, job);

        if (fs.OK()) {
            base64::encoder er;
            er.encode(fs.ifs, fs.ofs);
        }
    }

    {
        char const* job = "decode";
        char const* in = "./base64.txt";
        char const* out = "./base64-out.webp";

        FileStatus fs = OpenFiles(in, out, job);

        if (fs.OK()) {
            base64::decoder er;
            er.decode(fs.ifs, fs.ofs);
        }
    }
}

int main(int, char**)
{
    std::system("chcp 65001 > nul");

    testFile();

    std::system("pause > nul");

    return 0;
}