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);