Base64 encode using boost throw exception(使用 boost 抛出异常的 Base64 编码)
问题描述
我尝试使用 boost base64 编码器,我找到了一个例子,但我得到了异常
I trying to use boost base64 encoder, I found an example but I got and exception
typedef
transform_width< binary_from_base64<std::string::const_iterator>, 8, 6 > it_binary_t
我用过的
std::string b64E(it_binary_t(Encrip.begin()), it_binary_t(Encrip.end()));
我明白了
agentid_coder.exe 中 0x75b1b9bc 处未处理的异常:Microsoft C++异常:内存中的 boost::archive::iterators::dataflow_exception位置 0x0046ed94..
Unhandled exception at 0x75b1b9bc in agentid_coder.exe: Microsoft C++ exception: boost::archive::iterators::dataflow_exception at memory location 0x0046ed94..
我找到了这个解决方法,但得到了相同的结果
I found this workaround but I get the same result
string dec(
it_binary_t(Encrip.begin()),
it_binary_t(Encrip.begin() + Encrip.length() - 1)
);
我正在使用 MSVS2008 并提升 1.38
I am using MSVS2008 and boost 1.38
推荐答案
不幸的是 iterator_adaptors
binary_from_base64
和 transform_width
两个的组合不是一个完整的 base64 编码器/解码器.Base64 将 24 位(3 个字节)的组表示为 4 个字符,每个字符编码 6 位.如果输入数据不是这种 3 字节组的整数倍,则必须用一或两个零字节填充.为了指示添加了多少填充字节,将一两个 =
字符附加到编码字符串.
Unfortunately the combination of the two iterator_adaptors
binary_from_base64
and transform_width
is not a complete base64 encoder/decoder. Base64 represents groups of 24 bits (3 bytes) as 4 characters, each of which encodes 6 bits. If the input data is not an integer multiple of such 3 byte groups it has to be padded with one or two zero bytes. To indicate how many padding bytes were added, one or two =
characters are appended to the encoded string.
transform_width
负责将 8 位二进制转换为 6 位整数,它不会自动应用此填充,而是由用户完成.一个简单的例子:
transform_width
, which is responsible for the 8bit binary to 6bit integer conversion does not apply this padding automatically, it has do be done by the user. A simple example:
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/archive/iterators/insert_linebreaks.hpp>
#include <boost/archive/iterators/remove_whitespace.hpp>
#include <iostream>
#include <string>
using namespace boost::archive::iterators;
using namespace std;
int main(int argc, char **argv) {
typedef transform_width< binary_from_base64<remove_whitespace<string::const_iterator> >, 8, 6 > it_binary_t;
typedef insert_linebreaks<base64_from_binary<transform_width<string::const_iterator,6,8> >, 72 > it_base64_t;
string s;
getline(cin, s, '
');
cout << "Your string is: '"<<s<<"'"<<endl;
// Encode
unsigned int writePaddChars = (3-s.length()%3)%3;
string base64(it_base64_t(s.begin()),it_base64_t(s.end()));
base64.append(writePaddChars,'=');
cout << "Base64 representation: " << base64 << endl;
// Decode
unsigned int paddChars = count(base64.begin(), base64.end(), '=');
std::replace(base64.begin(),base64.end(),'=','A'); // replace '=' by base64 encoding of ' '
string result(it_binary_t(base64.begin()), it_binary_t(base64.end())); // decode
result.erase(result.end()-paddChars,result.end()); // erase padding ' ' characters
cout << "Decoded: " << result << endl;
return 0;
}
请注意,我添加了 insert_linebreaks
和 remove_whitespace
迭代器,因此 base64 输出格式很好,并且可以解码带有换行符的 base64 输入.不过这些都是可选的.
Note that I added the insert_linebreaks
and remove_whitespace
iterators, so that the base64 output is nicely formatted and base64 input with line breaks can be decoded. These are optional though.
使用需要不同填充的不同输入字符串运行:
Run with different input strings which require different padding:
$ ./base64example
Hello World!
Your string is: 'Hello World!'
Base64 representation: SGVsbG8gV29ybGQh
Decoded: Hello World!
$ ./base64example
Hello World!!
Your string is: 'Hello World!!'
Base64 representation: SGVsbG8gV29ybGQhIQ==
Decoded: Hello World!!
$ ./base64example
Hello World!!!
Your string is: 'Hello World!!!'
Base64 representation: SGVsbG8gV29ybGQhISE=
Decoded: Hello World!!!
您可以使用此 online-encoder/decoder 检查 base64 字符串.
You can check the base64 strings with this online-encoder/decoder.
这篇关于使用 boost 抛出异常的 Base64 编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 boost 抛出异常的 Base64 编码
基础教程推荐
- 使用从字符串中提取的参数调用函数 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- Windows Media Foundation 录制音频 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01