c++ - 如何仅使用 boost 将字符串编码为 base64?

标签 c++ string boost base64

我正在尝试将一个简单的 ASCII 字符串快速编码为 base64(使用 boost::asio 的基本 HTTP 身份验证),而不是粘贴任何新代码或使用 boost 之外的任何库。

简单的签名看起来像: string Base64Encode(const string& text);

我再次意识到该算法很简单,并且有很多库/示例这样做,但我正在寻找一个干净的 boost 示例。我发现了 boost 序列化,但那里或谷歌没有明确的例子。 http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/dataflow.html

如果不将实际的 base64 算法显式添加到我的代码中,这是否可行?

最佳答案

这是我的解决方案。它使用与此页面上的其他解决方案相同的基本技术,但以我认为更优雅的方式解决了填充问题。此解决方案还利用了 C++11。

我认为大部分代码都是不言自明的。编码函数中的数学位计算我们需要添加的“=”字符的数量。 val.size() 的模 3 是余数,但我们真正想要的是 val.size() 和下一个可被三整除的数字之间的差异。由于我们有余数,我们可以从 3 中减去余数,但是在我们想要 0 的情况下剩下 3,所以我们必须再对 3 取模一次。

#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/algorithm/string.hpp>

std::string decode64(const std::string &val) {
    using namespace boost::archive::iterators;
    using It = transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
    return boost::algorithm::trim_right_copy_if(std::string(It(std::begin(val)), It(std::end(val))), [](char c) {
        return c == '\0';
    });
}

std::string encode64(const std::string &val) {
    using namespace boost::archive::iterators;
    using It = base64_from_binary<transform_width<std::string::const_iterator, 6, 8>>;
    auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
    return tmp.append((3 - val.size() % 3) % 3, '=');
}

关于c++ - 如何仅使用 boost 将字符串编码为 base64?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053538/

相关文章:

c++ - boost::asio::ip::tcp::acceptor 如何与 TCP_DEFER_ACCEPT 和 TCP_FASTOPEN 一起工作

c++ - Boost序列化在从二进制文件读取时抛出异常

c++ - 了解追加模式下的闪存文件系统磨损

c++ - 如何将整个 vector 复制到队列中?

c# - 使用 C# 使用字符数组修剪字符串

javascript - Mysql 数据库中更快的搜索字符串

c++ - 如何使用指定的编译器(例如 GCC)安装 Boost

c++ - 是否有任何具有非 IEEE C/C++ 浮点格式的现代平台?

c++ - MPI_File_read 错误

r - 使用 R 中的列表从多列中提取字符串