| 7a956470 |
sago007 |
2016-02-14 17:09 |
1 |
/* |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
2 |
Copyright (C) 2004-2008 René Nyffenegger |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
3 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
4 |
This source code is provided 'as-is', without any express or implied |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
5 |
warranty. In no event will the author be held liable for any damages |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
6 |
arising from the use of this software. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
7 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
8 |
Permission is granted to anyone to use this software for any purpose, |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
9 |
including commercial applications, and to alter it and redistribute it |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
10 |
freely, subject to the following restrictions: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
11 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
12 |
1. The origin of this source code must not be misrepresented; you must not |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
13 |
claim that you wrote the original source code. If you use this source code |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
14 |
in a product, an acknowledgment in the product documentation would be |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
15 |
appreciated but is not required. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
16 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
17 |
2. Altered source versions must be plainly marked as such, and must not be |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
18 |
misrepresented as being the original source code. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
19 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
20 |
3. This notice may not be removed or altered from any source distribution. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
21 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
22 |
René Nyffenegger rene.nyffenegger@adp-gmbh.ch |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
23 |
*/ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
24 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
25 |
#ifndef CEREAL_EXTERNAL_BASE64_HPP_ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
26 |
#define CEREAL_EXTERNAL_BASE64_HPP_ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
27 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
28 |
#include <string> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
29 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
30 |
namespace cereal |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
31 |
{ |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
32 |
namespace base64 |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
33 |
{ |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
34 |
static const std::string chars = |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
35 |
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
36 |
"abcdefghijklmnopqrstuvwxyz" |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
37 |
"0123456789+/"; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
38 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
39 |
static inline bool is_base64(unsigned char c) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
40 |
return (isalnum(c) || (c == '+') || (c == '/')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
41 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
42 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
43 |
inline std::string encode(unsigned char const* bytes_to_encode, size_t in_len) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
44 |
std::string ret; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
45 |
int i = 0; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
46 |
int j = 0; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
47 |
unsigned char char_array_3[3]; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
48 |
unsigned char char_array_4[4]; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
49 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
50 |
while (in_len--) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
51 |
char_array_3[i++] = *(bytes_to_encode++); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
52 |
if (i == 3) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
53 |
char_array_4[0] = static_cast<unsigned char>((char_array_3[0] & 0xfc) >> 2); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
54 |
char_array_4[1] = static_cast<unsigned char>( ( ( char_array_3[0] & 0x03 ) << 4 ) + ( ( char_array_3[1] & 0xf0 ) >> 4 ) ); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
55 |
char_array_4[2] = static_cast<unsigned char>( ( ( char_array_3[1] & 0x0f ) << 2 ) + ( ( char_array_3[2] & 0xc0 ) >> 6 ) ); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
56 |
char_array_4[3] = static_cast<unsigned char>( char_array_3[2] & 0x3f ); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
57 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
58 |
for(i = 0; (i <4) ; i++) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
59 |
ret += chars[char_array_4[i]]; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
60 |
i = 0; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
61 |
} |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
62 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
63 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
64 |
if (i) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
65 |
{ |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
66 |
for(j = i; j < 3; j++) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
67 |
char_array_3[j] = '\0'; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
68 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
69 |
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
70 |
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
71 |
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
72 |
char_array_4[3] = char_array_3[2] & 0x3f; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
73 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
74 |
for (j = 0; (j < i + 1); j++) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
75 |
ret += chars[char_array_4[j]]; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
76 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
77 |
while((i++ < 3)) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
78 |
ret += '='; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
79 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
80 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
81 |
return ret; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
82 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
83 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
84 |
inline std::string decode(std::string const& encoded_string) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
85 |
size_t in_len = encoded_string.size(); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
86 |
size_t i = 0; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
87 |
size_t j = 0; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
88 |
int in_ = 0; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
89 |
unsigned char char_array_4[4], char_array_3[3]; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
90 |
std::string ret; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
91 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
92 |
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
93 |
char_array_4[i++] = encoded_string[in_]; in_++; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
94 |
if (i ==4) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
95 |
for (i = 0; i <4; i++) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
96 |
char_array_4[i] = static_cast<unsigned char>(chars.find( char_array_4[i] )); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
97 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
98 |
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
99 |
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
100 |
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
101 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
102 |
for (i = 0; (i < 3); i++) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
103 |
ret += char_array_3[i]; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
104 |
i = 0; |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
105 |
} |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
106 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
107 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
108 |
if (i) { |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
109 |
for (j = i; j <4; j++) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
110 |
char_array_4[j] = 0; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
111 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
112 |
for (j = 0; j <4; j++) |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
113 |
char_array_4[j] = static_cast<unsigned char>(chars.find( char_array_4[j] )); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
114 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
115 |
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
116 |
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
117 |
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
118 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
119 |
for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
120 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
121 |
|
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
122 |
return ret; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
123 |
} |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
124 |
} // namespace base64 |
| 6c5f2c01 |
sago007 |
2017-03-15 17:56 |
125 |
} // namespace cereal |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
126 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
127 |
#endif // CEREAL_EXTERNAL_BASE64_HPP_ |
|
|
1970-01-01 00:00 |
128 |
|