gpt4 book ai didi

c++ - 使用 boost 抛出异常的 Base64 编码

转载 作者:可可西里 更新时间:2023-11-01 16:26:02 25 4
gpt4 key购买 nike

我尝试使用 boost base64 编码器,我找到了一个示例,但我遇到了异常

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()));

我明白了

Unhandled exception at 0x75b1b9bc in agentid_coder.exe: Microsoft C++ exception: boost::archive::iterators::dataflow_exception at memory location 0x0046ed94..

我找到了这个解决方法,但我得到了相同的结果

 string dec( 
it_binary_t(Encrip.begin()),
it_binary_t(Encrip.begin() + Encrip.length() - 1)
);

我正在使用 MSVS2008 和 boost 1.38

最佳答案

不幸的是,iterator_adaptors binary_from_base64transform_width 这两个组合并不是一个完整的 base64 编码器/解码器。 Base64 将 24 位(3 字节)的组表示为 4 个字符,每个字符编码 6 位。如果输入数据不是这 3 个字节组的整数倍,则必须用一个或两个零字节填充。为了指示添加了多少个填充字节,将一个或两个 = 字符附加到编码字符串。

transform_width,负责 8 位二进制到 6 位整数的转换,不会自动应用此填充,它必须由用户完成。一个简单的例子:

#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, '\n');
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 '\0'
string result(it_binary_t(base64.begin()), it_binary_t(base64.end())); // decode
result.erase(result.end()-paddChars,result.end()); // erase padding '\0' characters
cout << "Decoded: " << result << endl;
return 0;
}

请注意,我添加了 insert_linebreaksremove_whitespace 迭代器,以便 base64 输出的格式很好,并且可以解码带有换行符的 base64 输入。不过这些都是可选的。

使用需要不同填充的不同输入字符串运行:

$ ./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 字符串.

关于c++ - 使用 boost 抛出异常的 Base64 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10521581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com