gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 14:00:33 33 4
gpt4 key购买 nike

我正在尝试将一个简单的 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/

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