My Project
base64.cc
Go to the documentation of this file.
1 #include "osl/misc/base64.h"
3 #include <sstream>
4 std::string osl::misc::
5 base64Encode(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 
55 boost::dynamic_bitset<> osl::misc::
56 base64Decode(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 ␌
106 std::string osl::misc::
107 toBase64(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 
132 toCompactBoard(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な局面の表現
Definition: compactBoard.h:60
void writeInt(std::ostream &os, int n)
Definition: openingBook.cc:18
int readInt(std::istream &is)
Definition: openingBook.cc:7
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