Boost 图片/文件转base64编码
1. Boost的Base64
Boost实现了base64的编码,包含在头文件:
#include "boost/archive/iterators/binary_from_base64.hpp"
#include "boost/archive/iterators/base64_from_binary.hpp"
#include "boost/archive/iterators/transform_width.hpp"
网上大多是针对字符串的使用,本示例将对文件或图片的使用提供一个完整的例子。
其中文件的读写使用的C函数,也可以换成C++的stream。
2. 实例
#include <cstdio>
#include <list>
#include <vector>
#include "boost/archive/iterators/binary_from_base64.hpp"
#include "boost/archive/iterators/base64_from_binary.hpp"
#include "boost/archive/iterators/transform_width.hpp"
#include <boost/algorithm/string.hpp>
using namespace boost::archive::iterators;
int main()
{
//data from file
FILE* file_in = fopen("/home/ubuntu/Pictures/mars.png","rb");
if(file_in == NULL)
return -1;
fseek (file_in, 0, SEEK_END);
long size=ftell (file_in);
char* buffer = (char*)malloc(sizeof(char)*size);
fseek (file_in, 0, SEEK_SET);
size_t ret = fread(buffer, sizeof(char), size, file_in);
fclose (file_in);
//encode
typedef
base64_from_binary<
transform_width<char *, 6, sizeof(char) * 8>
>
base64_encode_itor;
std::string text_base64;
std::copy(
base64_encode_itor(buffer),
base64_encode_itor(buffer + size),
std::back_inserter(text_base64)
);
free(buffer);
//编码填充=
text_base64.append((3 - size % 3) % 3, '=');
//decode
//解码前去除最后填充的=
boost::trim_right_if(text_base64,boost::is_any_of("="));
typedef
transform_width<
binary_from_base64< typename std::list<char>::iterator>,
sizeof(char) * 8,
6
>
base64_decode_itor;
std::vector<char> decode_result;
std::copy(
base64_decode_itor(text_base64.begin()),
base64_decode_itor(text_base64.end()),
std::back_inserter(decode_result)
);
//data to file
FILE* file_out = fopen("/home/ubuntu/Pictures/mars_1.png","wb");
if(file_out == NULL)
return -1;
fwrite(&decode_result[0], sizeof(char), decode_result.size(),file_out);
fclose(file_out);
return 0;
}
3. 总结
Boost 的 base64编码总体来说比较繁琐,完整的文档很少,导致使用体验并不好。
我们可以选择其它的base64编码,例如百度云SDK的base64,或者coreutils的base64等,对于基础扎实的人可以直接写编解码函数,并不困难。