Giri's C++ Support Library
C++ library providing everything you need to quickly create awesome applications.
Base64.h
Go to the documentation of this file.
1 
42 #ifndef SUPPORTLIB_BASE64_H
43 #define SUPPORTLIB_BASE64_H
44 #include <string>
45 #include <vector>
46 
47 namespace giri {
48 
52  namespace Base64 {
53 
60  inline std::string Encode(const std::vector<char>& data) {
61  static constexpr char sEncodingTable[] = {
62  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
63  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
64  'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
65  'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
66  'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
67  'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
68  'w', 'x', 'y', 'z', '0', '1', '2', '3',
69  '4', '5', '6', '7', '8', '9', '+', '/'
70  };
71 
72  size_t in_len = data.size();
73  size_t out_len = 4 * ((in_len + 2) / 3);
74  std::string ret(out_len, '\0');
75  size_t i;
76  char *p = const_cast<char*>(ret.c_str());
77 
78  for (i = 0; i < in_len - 2; i += 3) {
79  *p++ = sEncodingTable[(data[i] >> 2) & 0x3F];
80  *p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int) (data[i + 1] & 0xF0) >> 4)];
81  *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2) | ((int) (data[i + 2] & 0xC0) >> 6)];
82  *p++ = sEncodingTable[data[i + 2] & 0x3F];
83  }
84  if (i < in_len) {
85  *p++ = sEncodingTable[(data[i] >> 2) & 0x3F];
86  if (i == (in_len - 1)) {
87  *p++ = sEncodingTable[((data[i] & 0x3) << 4)];
88  *p++ = '=';
89  }
90  else {
91  *p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int) (data[i + 1] & 0xF0) >> 4)];
92  *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2)];
93  }
94  *p++ = '=';
95  }
96 
97  return ret;
98  }
104  inline std::vector<char> Decode(const std::string& base64Data) {
105  static constexpr unsigned char kDecodingTable[] = {
106  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
107  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
108  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
109  52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
110  64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
111  15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
112  64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
113  41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
114  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
115  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
116  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
117  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
118  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
119  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
120  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
121  64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
122  };
123 
124  size_t in_len = base64Data.size();
125  if (in_len % 4 != 0) return {};
126 
127  size_t out_len = in_len / 4 * 3;
128  if (base64Data[in_len - 1] == '=') out_len--;
129  if (base64Data[in_len - 2] == '=') out_len--;
130 
131  std::vector<char> out(out_len);
132 
133  for (size_t i = 0, j = 0; i < in_len;) {
134  uint32_t a = base64Data[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(base64Data[i++])];
135  uint32_t b = base64Data[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(base64Data[i++])];
136  uint32_t c = base64Data[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(base64Data[i++])];
137  uint32_t d = base64Data[i] == '=' ? 0 & i++ : kDecodingTable[static_cast<int>(base64Data[i++])];
138  uint32_t triple = (a << 3 * 6) + (b << 2 * 6) + (c << 1 * 6) + (d << 0 * 6);
139  if (j < out_len) out[j++] = (triple >> 2 * 8) & 0xFF;
140  if (j < out_len) out[j++] = (triple >> 1 * 8) & 0xFF;
141  if (j < out_len) out[j++] = (triple >> 0 * 8) & 0xFF;
142  }
143 
144  return out;
145  }
146  }
147 }
148 
149 #endif // SUPPORTLIB_BASE64_H
std::vector< char > Decode(const std::string &base64Data)
Definition: Base64.h:104
std::string Encode(const std::vector< char > &data)
Definition: Base64.h:60
Namespace for giri's C++ support library.
Definition: Base64.h:47