使用Boost C ++库,我尝试使用以下代码base64decode以下base64编码值:OTE4ZDUxYzM0ZTIyNmEzZDVmY2NjNjAyMzYyOTU5MTg0NzVmYWEwMjox:
std::string base64_decode(const std::string& s) {
namespace bai = boost::archive::iterators;
std::stringstream os;
typedef bai::transform_width<bai::binary_from_base64<const char *>, 8, 6> base64_dec;
unsigned int size = s.size();
// Remove the padding characters, cf. https://svn.boost.org/trac/boost/ticket/5629
if (size && s[size - 1] == '=') {
--size;
if (size && s[size - 1] == '=') --size;
}
if (size == 0) return std::string();
std::copy(base64_dec(s.data()), base64_dec(s.data() + size),
std::ostream_iterator<char>(os));
return os.str();
看起来编码正确发生了,但是,在解码时,我仍然得到以下错误:在抛出boost :: archive :: iterators :: dataflow_exception what()的实例后调用终止:尝试解码a值 不在base64字符集中的行:
std::copy(base64_dec(s.data()), base64_dec(s.data() + size), std::ostream_iterator<char>(os));
答案 0 :(得分:1)
我没有评论的声誉,所以这是一个答案:
&#34;尝试解码不在base64字符集中的值&#34;听起来你应该验证给定输入的函数的实际输入
OTE4ZDUxYzM0ZTIyNmEzZDVmY2NjNjAyMzYyOTU5MTg0NzVmYWEwMjox
您的代码有效:https://ideone.com/zWl52N
答案 1 :(得分:0)
更改
std::copy(base64_dec(s.data()), base64_dec(s.data() + size), std::ostream_iterator<char>(os))
到
return std::string( base64_dec(s.c_str()), base64_dec(s.c_str() + size))
解决了这个问题。