10 const size_t bits_to_add = 6 - src.size()%6;
13 for (
size_t i=0; i<bits_to_add; ++i)
19 assert(src.size()%6 == 0);
20 assert(src.size()/6 > 0);
22 std::vector<char> dst(src.size()/6, 0);
23 const boost::dynamic_bitset<> mask(src.size(), 63ul);
24 for (
size_t i=0; i<dst.size(); ++i)
26 const unsigned long c = ((src >> i*6) & mask).to_ulong();
29 dst[dst.size()-1-i] =
static_cast<char>(c+65);
30 else if (26 <= c && c <= 51)
31 dst[dst.size()-1-i] =
static_cast<char>(c+97-26);
32 else if (52 <= c && c <= 61)
33 dst[dst.size()-1-i] =
static_cast<char>(c+48-52);
35 dst[dst.size()-1-i] =
'-';
37 dst[dst.size()-1-i] =
'_';
45 const size_t char_to_add = 4 - dst.size()%4;
48 for (
size_t i=0; i<char_to_add; ++i)
52 return std::string(dst.begin(), dst.end());
58 if (src.empty() || src.size()%4 != 0)
59 return boost::dynamic_bitset<>(0);
63 while (src[src.size()-1] ==
'=')
65 src.erase(src.end()-1);
69 return boost::dynamic_bitset<>(0);
72 const size_t dst_size = src.size()*6;
73 const size_t redundant = dst_size%8;
74 boost::dynamic_bitset<> dst(dst_size, 0ul);
77 unsigned long tmp = 0;
78 if (48 <= c && c <= 48+9)
80 else if (65 <= c && c <= 65+25)
82 else if (97 <= c && c <= 97+25)
91 return boost::dynamic_bitset<>(0);
94 const boost::dynamic_bitset<> mask(dst_size, tmp);
95 dst = (dst << 6) | mask;
100 dst.resize(dst.size()-redundant);
109 const static size_t ninteger = 41;
110 const static size_t integer_size = 32;
111 const static size_t size = ninteger*integer_size;
113 std::stringstream ss;
117 ss.seekg(0, std::ios::beg);
119 boost::dynamic_bitset<> bits(size);
121 for (
size_t i = 0; i < ninteger; ++i)
123 const unsigned int tmp =
static_cast<unsigned int>(book::readInt(ss));
124 const boost::dynamic_bitset<> mask(size,
static_cast<unsigned long>(tmp));
125 bits = (bits << integer_size) | mask;
128 return misc::base64Encode(bits);
134 const boost::dynamic_bitset<> bits = misc::base64Decode(str);
135 std::stringstream ss;
136 assert(bits.size()%32 == 0);
137 const boost::dynamic_bitset<> mask(bits.size(), 4294967295ul);
138 for (
size_t i=0; i<bits.size()/32; ++i)
140 const unsigned long tmp = ((bits >> ((bits.size()/32-1-i)*32)) & mask).to_ulong();
141 book::writeInt(ss,
static_cast<int>(tmp));
145 ss.seekg(0, std::ios::beg);