-
Notifications
You must be signed in to change notification settings - Fork 1
/
base64.hh
102 lines (93 loc) · 3.25 KB
/
base64.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef BASE64
#define BASE64
#include <string>
#include <vector>
#include <cstdint>
using str = std::string;
using vector_uint8t = std::vector<uint8_t>;
str b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int COUNT(str data, char ch){
int n = 0;
for(char c : data)
{
n += (c == ch) ? 1 : 0;
}
return n;
};
namespace base64
{
template <typename T> std::string encode(T data)
{
int iters = data.size()/3;
uint32_t bits;
std::string result;
for(int i = 0, j = 0 ; j < iters ; i+=3, j++)
{
bits = ((data[i] << 16)) | ((data[i+1] << 8)) | (data[i+2]);
result+=(b64_table[(bits >> 18) & 0x3f]);
result+=(b64_table[(bits >> 12) & 0x3f]);
result+=(b64_table[(bits >> 6) & 0x3f]);
result+=(b64_table[(bits >> 0) & 0x3f]);
}
if(int rest = data.size()%3)
{
if(rest == 1)
{
uint16_t bits = data[iters*3] << 4;
result+=b64_table[(bits >> 6) & 0x3f];
result+=b64_table[(bits >> 0) & 0x3f];
result+="==";
}
else{
uint32_t bits = (data[iters*3] << 10) | (data[iters*3+1] << 2);
result+=b64_table[(bits >> 12) & 0x3f];
result+=b64_table[(bits >> 6) & 0x3f];
result+=b64_table[(bits >> 0) & 0x3f];
result+='=';
}
}
return result;
}
template <typename T> std::string decode(T data,uint8_t force = 0)
{
if(!force && data.size()%4 != 0){
fprintf(stderr,"[!] - Wrong input size, if you still want to decode,\n"
"make sure that you pass an 1 -> base64::decode(mydata,1)\n");
return "";
}
int iters = data.size()/4;
uint32_t bits;
std::string result;
for(int i = 0, j = 0; j < iters-1; i+=4, j++)
{
bits = (b64_table.find(data[i]) << 18) | (b64_table.find(data[i+1]) << 12) | (b64_table.find(data[i+2]) << 6) | (b64_table.find(data[i+3]));
result+=((bits >> 16) & 0xff);
result+=((bits >> 8) & 0xff);
result+=((bits >> 0) & 0xff);
}
str last4(&data[data.size()-4], 4);
if(int padd = COUNT(last4, '='))
{
if(padd == 1)
{
uint32_t bits = (b64_table.find(last4[0]) << 18 | (b64_table.find(last4[1]) << 12 | (b64_table.find(last4[2]) << 6)));
result+=((bits >> 16) & 0xff);
result+=((bits >> 8) & 0xff);
result+=((bits >> 0) & 0xff);
}
else if(padd == 2)
{
uint16_t bits = (b64_table.find(last4[0]) << 10) | (b64_table.find(last4[1]) << 4);
result+=((bits >> 8) & 0xff);
result+=((bits >> 0) & 0xff);
}
return result;
}
bits = (b64_table.find(last4[0]) << 18) | (b64_table.find(last4[1]) << 12) | (b64_table.find(last4[2]) << 6) | (b64_table.find(last4[3]));
result+=((bits >> 16) & 0xff);
result+=((bits >> 8) & 0xff);
result+=((bits >> 0) & 0xff);
return result;
}
}
#endif