Joedb 9.1.4
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
base64_decode.cpp
Go to the documentation of this file.
1#include "joedb/ui/base64.h"
2
3#include <stdint.h>
4
5namespace joedb
6{
7 static constexpr char base64_decoding[256] =
8 {
9 0, 0, 0, 0, 0, 0, 0, 0,
10 0, 0, 0, 0, 0, 0, 0, 0,
11
12 0, 0, 0, 0, 0, 0, 0, 0,
13 0, 0, 0, 0, 0, 0, 0, 0,
14
15 0, 0, 0, 0, 0, 0, 0, 0,
16 0, 0, 0, 62, 0, 0, 0, 63,
17
18 52, 53, 54, 55, 56, 57, 58, 59,
19 60, 61, 0, 0, 0, 0, 0, 0,
20
21 0, 0, 1, 2, 3, 4, 5, 6,
22 7, 8, 9, 10, 11, 12, 13, 14,
23
24 15, 16, 17, 18, 19, 20, 21, 22,
25 23, 24, 25, 0, 0, 0, 0, 0,
26
27 0, 26, 27, 28, 29, 30, 31, 32,
28 33, 34, 35, 36, 37, 38, 39, 40,
29
30 41, 42, 43, 44, 45, 46, 47, 48,
31 49, 50, 51, 0, 0, 0, 0, 0,
32
33 0, 0, 0, 0, 0, 0, 0, 0,
34 0, 0, 0, 0, 0, 0, 0, 0,
35
36 0, 0, 0, 0, 0, 0, 0, 0,
37 0, 0, 0, 0, 0, 0, 0, 0,
38
39 0, 0, 0, 0, 0, 0, 0, 0,
40 0, 0, 0, 0, 0, 0, 0, 0,
41
42 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, 0, 0, 0, 0, 0,
44
45 0, 0, 0, 0, 0, 0, 0, 0,
46 0, 0, 0, 0, 0, 0, 0, 0,
47
48 0, 0, 0, 0, 0, 0, 0, 0,
49 0, 0, 0, 0, 0, 0, 0, 0,
50
51 0, 0, 0, 0, 0, 0, 0, 0,
52 0, 0, 0, 0, 0, 0, 0, 0,
53
54 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 0, 0, 0,
56 };
57
58 /////////////////////////////////////////////////////////////////////////////
59 std::string base64_decode(const std::string &input)
60 /////////////////////////////////////////////////////////////////////////////
61 {
62 std::string result;
63
64 size_t N = input.size() / 4;
65 size_t remainder = 0;
66
67 if (N > 0)
68 {
69 if (input[input.size() - 1] == '=')
70 {
71 N--;
72 if (input[input.size() - 2] == '=')
73 remainder = 1;
74 else
75 remainder = 2;
76 }
77 }
78
79 result.resize(3 * N + remainder);
80
81 for (size_t i = 0; i < N; i++)
82 {
83 const uint32_t word =
84 (uint32_t(base64_decoding[uint8_t(input[4 * i + 0])]) << 18) |
85 (uint32_t(base64_decoding[uint8_t(input[4 * i + 1])]) << 12) |
86 (uint32_t(base64_decoding[uint8_t(input[4 * i + 2])]) << 6) |
87 (uint32_t(base64_decoding[uint8_t(input[4 * i + 3])]) );
88
89 result[3 * i + 0] = char(word >> 16);
90 result[3 * i + 1] = char(word >> 8);
91 result[3 * i + 2] = char(word );
92 }
93
94 if (remainder == 2)
95 {
96 const uint32_t word =
97 (uint32_t(base64_decoding[uint8_t(input[4 * N + 0])]) << 12) |
98 (uint32_t(base64_decoding[uint8_t(input[4 * N + 1])]) << 6) |
99 (uint32_t(base64_decoding[uint8_t(input[4 * N + 2])]) );
100
101 result[3 * N + 0] = char(word >> 10);
102 result[3 * N + 1] = char(word >> 2);
103 }
104 else if (remainder == 1)
105 {
106 const uint32_t word =
107 (uint32_t(base64_decoding[uint8_t(input[4 * N + 0])]) << 6) |
108 (uint32_t(base64_decoding[uint8_t(input[4 * N + 1])]) );
109
110 result[3 * N + 0] = char(word >> 4);
111 }
112
113 return result;
114 }
115}
std::string base64_decode(const std::string &input)
Definition Blob.h:7