3 #include <boost/foreach.hpp>
11 const size_t bits_to_add = 6 - src.size()%6;
14 for (
size_t i=0; i<bits_to_add; ++i)
20 assert(src.size()%6 == 0);
21 assert(src.size()/6 > 0);
23 vector<char> dst(src.size()/6, 0);
24 const boost::dynamic_bitset<> mask(src.size(), 63ul);
25 for (
size_t i=0; i<dst.size(); ++i)
27 const unsigned long c = ((src >> i*6) & mask).to_ulong();
30 dst[dst.size()-1-i] =
static_cast<char>(c+65);
31 else if (26 <= c && c <= 51)
32 dst[dst.size()-1-i] =
static_cast<char>(c+97-26);
33 else if (52 <= c && c <= 61)
34 dst[dst.size()-1-i] =
static_cast<char>(c+48-52);
36 dst[dst.size()-1-i] =
'-';
38 dst[dst.size()-1-i] =
'_';
46 const size_t char_to_add = 4 - dst.size()%4;
49 for (
size_t i=0; i<char_to_add; ++i)
53 return std::string(dst.begin(), dst.end());
59 if (src.empty() || src.size()%4 != 0)
60 return boost::dynamic_bitset<>(0);
64 while (src[src.size()-1] ==
'=')
66 src.erase(src.end()-1);
70 return boost::dynamic_bitset<>(0);
73 const size_t dst_size = src.size()*6;
74 const size_t redundant = dst_size%8;
75 boost::dynamic_bitset<> dst(dst_size, 0ul);
76 BOOST_FOREACH(
char c, src)
78 unsigned long tmp = 0;
79 if (48 <= c && c <= 48+9)
81 else if (65 <= c && c <= 65+25)
83 else if (97 <= c && c <= 97+25)
92 return boost::dynamic_bitset<>(0);
95 const boost::dynamic_bitset<> mask(dst_size, tmp);
96 dst = (dst << 6) | mask;
101 dst.resize(dst.size()-redundant);