My Project
base64.cc
Go to the documentation of this file.
1#include "osl/misc/base64.h"
3#include <sstream>
4std::string osl::misc::
5base64Encode(boost::dynamic_bitset<> src)
6{
7 if (src.empty())
8 return "";
9
10 const size_t bits_to_add = 6 - src.size()%6;
11 if (bits_to_add < 6)
12 {
13 for (size_t i=0; i<bits_to_add; ++i)
14 {
15 src.push_back(0ul); // this appends to the most significant bit
16 src <<= 1; // Instead, append to the least significant bit
17 }
18 }
19 assert(src.size()%6 == 0);
20 assert(src.size()/6 > 0);
21
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)
25 {
26 const unsigned long c = ((src >> i*6) & mask).to_ulong();
27 assert (c <= 63);
28 if (/*0 <= c &&*/ c <= 25) // A..Z
29 dst[dst.size()-1-i] = static_cast<char>(c+65);
30 else if (26 <= c && c <= 51) // a..z
31 dst[dst.size()-1-i] = static_cast<char>(c+97-26);
32 else if (52 <= c && c <= 61) // 0..9
33 dst[dst.size()-1-i] = static_cast<char>(c+48-52);
34 else if (c == 62)
35 dst[dst.size()-1-i] = '-'; // for URL instread of '+'
36 else if (c == 63)
37 dst[dst.size()-1-i] = '_'; // for URL instread of '/'
38 else
39 {
40 assert(false);
41 return "";
42 }
43 }
44
45 const size_t char_to_add = 4 - dst.size()%4;
46 if (char_to_add < 4)
47 {
48 for (size_t i=0; i<char_to_add; ++i)
49 dst.push_back('=');
50 }
51
52 return std::string(dst.begin(), dst.end());
53}
54
55boost::dynamic_bitset<> osl::misc::
56base64Decode(std::string src)
57{
58 if (src.empty() || src.size()%4 != 0)
59 return boost::dynamic_bitset<>(0);
60
61 {
62 int count = 0;
63 while (src[src.size()-1] == '=')
64 {
65 src.erase(src.end()-1);
66 ++count;
67 }
68 if (count >= 4)
69 return boost::dynamic_bitset<>(0);
70 }
71
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);
75 for (char c: src)
76 {
77 unsigned long tmp = 0;
78 if (48 <= c && c <= 48+9) // 0..9
79 tmp = c -48+52;
80 else if (65 <= c && c <= 65+25) // A..Z
81 tmp = c - 65;
82 else if (97 <= c && c <= 97+25) // a..z
83 tmp = c -97+26;
84 else if (c == '-')
85 tmp = 62;
86 else if (c == '_')
87 tmp = 63;
88 else
89 {
90 assert(false);
91 return boost::dynamic_bitset<>(0);
92 }
93 assert(/*0 <= tmp &&*/ tmp <= 63);
94 const boost::dynamic_bitset<> mask(dst_size, tmp);
95 dst = (dst << 6) | mask;
96 }
97 if (redundant > 0)
98 {
99 dst >>= redundant;
100 dst.resize(dst.size()-redundant);
101 }
102 return dst;
103}
104
105
106std::string osl::misc::
107toBase64(const book::CompactBoard& board)
108{
109 const static size_t ninteger = 41;
110 const static size_t integer_size = 32;
111 const static size_t size = ninteger*integer_size;
112
113 std::stringstream ss;
114 ss << board;
115
116 ss.clear();
117 ss.seekg(0, std::ios::beg);
118
119 boost::dynamic_bitset<> bits(size);
120
121 for (size_t i = 0; i < ninteger; ++i)
122 {
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;
126 }
127
128 return misc::base64Encode(bits);
129}
130
132toCompactBoard(const std::string& str)
133{
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)
139 {
140 const unsigned long tmp = ((bits >> ((bits.size()/32-1-i)*32)) & mask).to_ulong();
141 book::writeInt(ss, static_cast<int>(tmp));
142 }
143
144 ss.clear();
145 ss.seekg(0, std::ios::beg);
146
148 ss >> cb;
149 return cb;
150}
151
152// ;;; Local Variables:
153// ;;; mode:c++
154// ;;; c-basic-offset:2
155// ;;; End:
SimpleStateよりcompactな局面の表現
std::string base64Encode(boost::dynamic_bitset<> src)
Definition base64.cc:5
boost::dynamic_bitset base64Decode(std::string src)
Definition base64.cc:56
book::CompactBoard toCompactBoard(const std::string &str)
Definition base64.cc:132
std::string toBase64(const book::CompactBoard &)
Definition base64.cc:107