115 const uint8_t *enc_table = mod ? base64_enc_table_mod : base64_enc_table;
116 const char term_char = mod ?
'-' :
'=';
119 for (i = j = 0; i + 2 < raw_size; i+= 3, j += 4)
121 encoded[j] = enc_table[raw[i] >> 2];
122 encoded[j + 1] = enc_table[((raw[i] & 3) << 4) | (raw[i + 1] >> 4)];
123 encoded[j + 2] = enc_table[((raw[i + 1] & 0xf) << 2) | raw[i + 2] >> 6];
124 encoded[j + 3] = enc_table[(raw[i + 2] & 0x3f)];
128 if (i + 1 < raw_size)
131 encoded[j] = enc_table[raw[i] >> 2];
132 encoded[j + 1] = enc_table[((raw[i] & 3) << 4) | (raw[i + 1] >> 4)];
133 encoded[j + 2] = enc_table[(raw[i + 1] & 0xf) << 2];
134 encoded[j + 3] = term_char;
137 else if (i < raw_size)
140 encoded[j] = enc_table[raw[i] >> 2];
141 encoded[j + 1] = enc_table[(raw[i] & 3) << 4];
142 encoded[j + 2] = term_char;
143 encoded[j + 3] = term_char;
202 const uint8_t *dec_table = mod ? base64_dec_table_mod : base64_dec_table;
203 const char term_char = mod ?
'-' :
'=';
205 if (base64_dec_table[0] ==
'U')
206 base64_init_dec_tables ();
211 if (encoded_size & 3)
219 for (i = j = 0; i + 4 < encoded_size; i+= 4, j += 3)
221 if (dec_table[encoded[i + 0]] ==
'x' ||
222 dec_table[encoded[i + 1]] ==
'x' ||
223 dec_table[encoded[i + 2]] ==
'x' ||
224 dec_table[encoded[i + 3]] ==
'x')
227 raw[j] = (dec_table[encoded[i]] << 2) | (dec_table[encoded[i + 1]] >> 4);
228 raw[j + 1] = (dec_table[encoded[i + 1]] << 4) |
229 (dec_table[encoded[i + 2]] >> 2);
230 raw[j + 2] = (dec_table[encoded[i + 2]] << 6) |
231 (dec_table[encoded[i + 3]]);
235 if (dec_table[encoded[i + 0]] !=
'x' &&
236 dec_table[encoded[i + 1]] !=
'x' &&
237 encoded[i + 2] == term_char && encoded[i + 3] == term_char)
240 raw[j] = (dec_table[encoded[i]] << 2) |
241 (dec_table[encoded[i + 1]] >> 4);
246 else if (dec_table[encoded[i + 0]] !=
'x' &&
247 dec_table[encoded[i + 1]] !=
'x' &&
248 dec_table[encoded[i + 2]] !=
'x' && encoded[i + 3] == term_char)
251 raw[j] = (dec_table[encoded[i]] << 2) | (dec_table[encoded[i + 1]] >> 4);
252 raw[j + 1] = (dec_table[encoded[i + 1]] << 4) |
253 (dec_table[encoded[i + 2]] >> 2);
257 else if (dec_table[encoded[i + 0]] !=
'x' &&
258 dec_table[encoded[i + 1]] !=
'x' &&
259 dec_table[encoded[i + 2]] !=
'x' &&
260 dec_table[encoded[i + 3]] !=
'x')
263 raw[j] = (dec_table[encoded[i]] << 2) |
264 (dec_table[encoded[i + 1]] >> 4);
265 raw[j + 1] = (dec_table[encoded[i + 1]] << 4) |
266 (dec_table[encoded[i + 2]] >> 2);
267 raw[j + 2] = (dec_table[encoded[i + 2]] << 6) |
268 (dec_table[encoded[i + 3]]);