22static char encoder[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
23static char decoder[256];
24static int initialized;
36 memset(decoder, -1,
sizeof decoder);
38 for (;
i < 64; decoder[(
int)encoder[
i]] =
i, ++
i) {
47 base64_encsize(
int size)
49 return 4 * ((
size + 2) / 3);
55 uint32_t
a,
b,
c, triple;
57 dlen = base64_encsize(slen);
60 if (
src ==
nullptr || dest ==
nullptr) {
63 if (dlen + 1 >
size) {
74 for (
i = 0,
j = 0;
i < slen;) {
78 b =
i < slen ?
src[
i++] : 0;
79 c =
i < slen ?
src[
i++] : 0;
81 triple = (
a << 16) + (
b << 8) +
c;
83 dest[
j++] = encoder[(triple >> 18) & 0x3F];
84 dest[
j++] = encoder[(triple >> 12) & 0x3F];
85 dest[
j++] = encoder[(triple >> 6) & 0x3F];
86 dest[
j++] = encoder[triple & 0x3F];
108 size = base64_encsize(slen) + 1;
125 base64_decsize(
char*
src)
129 if (
src ==
nullptr) {
137 for (
i = 0;
src[slen -
i - 1] ==
'='; ++
i) {
141 return size - (
i >= 2 ? 2 :
i);
146 int slen, dlen, padlen,
i,
j;
147 uint32_t
a,
b,
c, d, triple;
150 base64_init_decoder();
153 if (
src ==
nullptr || dest ==
nullptr) {
167 for (padlen = 0;
src[slen - padlen - 1] ==
'='; ++padlen) {
176 dlen = base64_decsize(
src);
179 if (dlen + 1 >
size) {
183 for (
i = 0,
j = 0;
i < slen;) {
191 if (
src[slen - 1] ==
'=') {
193 if (
src[slen - 2] ==
'=') {
200 if (
a == -1 ||
b == -1 ||
c == -1 || d == -1) {
204 triple = (
a << 18) + (
b << 12) + (
c << 6) + d;
206 dest[
j++] = (triple >> 16) & 0xFF;
207 dest[
j++] = (triple >> 8) & 0xFF;
208 dest[
j++] = triple & 0xFF;
223 size = base64_decsize(
src) + 1;
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
unsigned char * base64_dec_malloc(char *src)
int base64_encode(char *dest, int size, unsigned char *src, int slen)
char * base64_enc_malloc(unsigned char *src, int slen)
int base64_decode(unsigned char *dest, int size, char *src)