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

哪些数据是文本数据?
能够解释成人类制定的字符数据,就可以称为文本数据。假设有一个文件,它包含的数据只使用到字符数据,并且这些字符数据全部采用同一种编码方案,那么,习惯上这个文件就会被称为“纯文本文件”。
base64挑选了64个字符来表达所有的二进制数据,它们是:
- 大小写字母:A-Z,a-z (52个)
- 数字:0-9 (10个)
- 加号:+ (1个)
- 斜杠:/ (1个)
base64效果:
- 将数据转换为人类认识的字符所组成的数据;
- 能看懂但无法理解。
base64编码的作用:满足了某些程序在某些环节下某些数据只能用字符串表达的需求。

典型使用示例(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;
}