方案一
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
bool Base64Encode(const std::string& input, std::string& output) {
typedef boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<std::string::const_iterator, 6, 8> > Base64EncodeIterator;
std::stringstream result;
std::copy(Base64EncodeIterator(input.begin()), Base64EncodeIterator(input.end()), std::ostream_iterator<char>(result));
size_t equal_count = (3 - input.length() % 3) % 3;
for (size_t i = 0; i < equal_count; i++) {
result.put('=');
}
output = result.str();
return output.empty() == false;
}
bool Base64Decode(const std::string& input, std::string& output) {
typedef boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<std::string::const_iterator>, 8, 6> Base64DecodeIterator;
std::stringstream result;
try {
std::copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), std::ostream_iterator<char>(result));
}
catch (...) {
return false;
}
output = result.str();
return output.empty() == false;
}
方案一有问题,在使用Base64Decode解码的时候,如果输入源的末尾有“=”补位符,那么output的字符串的长度是不对的,不是实际字符串的长度,比实际的字符串长度要长(就是包含补位符的input的字符串应算出来的解码长度)。
方案二
#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, '=');
}
方案二没有方案一的那个问题。
发表回复