12static const char cb64[]=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
15static const char cd64[]=
"|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
20static void b64_encode_block(
char in[3],
char out[4],
int len)
22 out[0] = (char) cb64[(
int)((in[0] & 0xfc) >> 2)];
23 out[1] = (char) cb64[(
int)(((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4))];
24 out[2] = (char) (len > 1 ? cb64[(
int)(((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6))] :
'=');
25 out[3] = (char) (len > 2 ? cb64[(
int)(in[2] & 0x3f)] :
'=');
28char *
b64_encode(
const char *src,
size_t srclen,
size_t linelen,
size_t &dstlen)
31 linelen = std::numeric_limits<size_t>::max();
36 size_t adjustment = (srclen % 3) ? (3 - (srclen % 3)) : 0;
37 size_t paddedlen = ((srclen + adjustment) / 3) * 4;
39 dstlen = paddedlen + paddedlen / linelen;
47 dst =
new char[dstlen + 1];
49 catch (std::exception &)
56 while (srcpos < srclen)
63 for (
int i = 0; i < 3; i++)
68 in[i] = src[srcpos++];
74 b64_encode_block(in, out, len);
76 for (
int i = 0; i < 4 && dstpos < dstlen; i++, dstpos++)
82 if (blocksout >= linelen / 4 || srcpos >= srclen)
84 if (blocksout > 0 && dstpos < dstlen)
95static void b64_decode_block(
char in[4],
char out[3])
97 out[0] = (char)(in[0] << 2 | in[1] >> 4);
98 out[1] = (char)(in[1] << 4 | in[2] >> 2);
99 out[2] = (char)(((in[2] << 6) & 0xc0) | in[3]);
102char *
b64_decode(
const char *src,
size_t srclen,
size_t &size)
104 size_t paddedsize = (srclen / 4) * 3;
109 dst =
new char[paddedsize];
111 catch (std::exception &)
120 size_t i, len, srcpos = 0;
122 while (srcpos <= srclen)
124 for (len = 0, i = 0; i < 4 && srcpos <= srclen; i++)
128 while (srcpos <= srclen &&
v == 0)
131 v = (char)((v < 43 || v > 122) ? 0 : cd64[
v - 43]);
133 v = (char)((
v ==
'$') ? 0 :
v - 61);
136 if (srcpos <= srclen)
140 in[i] = (char)(
v - 1);
148 b64_decode_block(in, out);
149 for (i = 0; i < len - 1; i++)
154 size = (size_t)(ptrdiff_t) (
d - dst);
char * b64_encode(const char *src, size_t srclen, size_t linelen, size_t &dstlen)
Base64-encode data.
char * b64_decode(const char *src, size_t srclen, size_t &size)
Decode base64 encoded data.