C/C++中使用Base64编码解码(使用boost库)

来源:互联网 发布:易语言端口转发 编辑:程序博客网 时间:2024/06/06 13:04

Base64是一种用64个字符来表示任意二进制数据的方法。
用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。
Base64是一种基于64个可打印字符来表示二进制数据的表示方法,从本质上看Base64编码就是将三字节转四字节,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。

如将字符串“Man”用Base64编码。


如果数据的长度不是3的整数倍,就要在后面补0再计算,每补2个0就在Base64串后加上1个‘=’。


Base64编码表如下:

 

Base64的不足之处

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。


由于boost库良好的封装,所以使用boost来完成Base64编码解码非常方便,下面直接上代码了:

#include <boost/archive/iterators/base64_from_binary.hpp>#include <boost/archive/iterators/binary_from_base64.hpp>#include <boost/archive/iterators/transform_width.hpp>#include <string>#include <iostream>#include <sstream>using namespace std;using namespace boost::archive::iterators;bool Base64Encode( const string & input, string * output ){typedef base64_from_binary<transform_width<string::const_iterator, 6, 8>> Base64EncodeIterator;stringstream result;try {copy( Base64EncodeIterator( input.begin() ), Base64EncodeIterator( input.end() ), ostream_iterator<char>( result ) );} catch ( ... ) {return false;}size_t equal_count = (3 - input.length() % 3) % 3;for ( size_t i = 0; i < equal_count; i++ ){result.put( '=' );}*output = result.str();return output->empty() == false;}bool Base64Decode( const string & input, string * output ){typedef transform_width<binary_from_base64<string::const_iterator>, 8, 6> Base64DecodeIterator;stringstream result;try {copy( Base64DecodeIterator( input.begin() ), Base64DecodeIterator( input.end() ), ostream_iterator<char>( result ) );} catch ( ... ) {return false;}*output = result.str();return output->empty() == false;}int _tmain(int argc, _TCHAR* argv[]){cout << "C/C++中使用Base64编码解码(使用boost库)" << endl;string input_str("http://blog.csdn.net/qq0824?viewmode=contents");string base64_str, output_str;cout << "origin text: \n" << input_str << endl;Base64Encode(input_str, &base64_str);cout << "encode: \n" << base64_str << endl;Base64Decode(base64_str, &output_str);cout << "decode: \n"<<output_str << endl;system("pause");return 0;}

运行结果如下:


阅读全文
0 0
原创粉丝点击