使用Boost解码Base64字符串

Den*_*r21 2 c++ base64 boost

我已经能够std::vector<char>使用boost和以下代码编码到Base64:

using namespace boost::archive::iterators;

std::string message(binary.begin(), binary.end());
std::stringstream os;
using base64_text = insert_linebreaks<base64_from_binary<transform_width<const char *, 6, 8>>, 72>;

std::copy(
    base64_text(message.c_str()),
    base64_text(message.c_str() + message.size()),
    ostream_iterator<char>(os)
);

return os.str();
Run Code Online (Sandbox Code Playgroud)

我在Stackoverflow上发现了这个.好吧,现在我想向后退一步,放入Base64格式化std::string并最终得到一个std::vector<char>.但我不能适应我的例子来反过来做事.我在网上找到了一些其他的代码,它与Hello World示例很好用,但是当有一个实际更大的Base64,它还包含一些像反斜杠这样的关键字符时,整个事情就崩溃了.

这就是我现在正在做的解码:

using namespace std;
using namespace boost::archive::iterators;

typedef
    transform_width<
        binary_from_base64<string::const_iterator>, 8, 6
        > binary_t;
string dec(binary_t(str.begin()), binary_t(str.end()));
return dec;
Run Code Online (Sandbox Code Playgroud)

当我要创建字符串时,它会在返回之前的最后一行崩溃.你看到它有什么问题吗?

ken*_*nba 5

base64 要求输入和输出分别填充为3和4的倍数.

这是一个使用以下方法解码base64的函数boost:

#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 <algorithm>    

std::string decode(std::string input)
{
  using namespace boost::archive::iterators;
  typedef transform_width<binary_from_base64<remove_whitespace
      <std::string::const_iterator> >, 8, 6> ItBinaryT;

  try
  {
    // If the input isn't a multiple of 4, pad with =
    size_t num_pad_chars((4 - input.size() % 4) % 4);
    input.append(num_pad_chars, '=');

    size_t pad_chars(std::count(input.begin(), input.end(), '='));
    std::replace(input.begin(), input.end(), '=', 'A');
    std::string output(ItBinaryT(input.begin()), ItBinaryT(input.end()));
    output.erase(output.end() - pad_chars, output.end());
    return output;
  }
  catch (std::exception const&)
  {
    return std::string("");
  }
}
Run Code Online (Sandbox Code Playgroud)

它是从这里获取的,其中boost也可以找到使用填充的编码功能.