#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
// Simple Base64 decoding table
static const unsigned char b64_table[256] = {
['A']=0, ['B']=1, ['C']=2, ['D']=3, ['E']=4, ['F']=5, ['G']=6, ['H']=7,
['I']=8, ['J']=9, ['K']=10, ['L']=11, ['M']=12, ['N']=13, ['O']=14, ['P']=15,
['Q']=16, ['R']=17, ['S']=18, ['T']=19, ['U']=20, ['V']=21, ['W']=22, ['X']=23,
['Y']=24, ['Z']=25,
['a']=26, ['b']=27, ['c']=28, ['d']=29, ['e']=30, ['f']=31, ['g']=32, ['h']=33,
['i']=34, ['j']=35, ['k']=36, ['l']=37, ['m']=38, ['n']=39, ['o']=40, ['p']=41,
['q']=42, ['r']=43, ['s']=44, ['t']=45, ['u']=46, ['v']=47, ['w']=48, ['x']=49,
['y']=50, ['z']=51,
['0']=52, ['1']=53, ['2']=54, ['3']=55, ['4']=56, ['5']=57, ['6']=58, ['7']=59,
['8']=60, ['9']=61, ['+']=62, ['/']=63
};
// Decodes Base64 string into output buffer, returns output length
int base64_decode(const char *in, unsigned char *out) {
int i, j = 0;
unsigned int val = 0;
int valb = -8;
for (i = 0; i < len; i++) {
unsigned char c = in[i];
if (isspace(c
) || c
== '=') continue; if (c > 127 || b64_table[c] == 0 && c != 'A') continue; // skip invalid
val = (val << 6) + b64_table[c];
valb += 6;
if (valb >= 0) {
out[j++] = (val >> valb) & 0xFF;
valb -= 8;
}
}
return j;
}
int main() {
// Base64 string containing "US4Dq"
const char *b64 = "US4Dq9Rdm05Rx/Z79RzHj6RqGHdO+INI/sVJfspO9jJUJmHKPlQH0mEOlSvsU";
unsigned char decoded[128];
int out_len, i;
out_len = base64_decode(b64, decoded);
printf("Decoded %d bytes:\n", out_len
); for (i = 0; i < out_len; ++i) {
printf("Byte %3d: 0x%02X", i
, decoded
[i
]); if (decoded[i] == 0x00 || decoded[i] == 0x04 || decoded[i] == 0x1A) {
printf(" <-- problematic byte"); }
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCi8vIFNpbXBsZSBCYXNlNjQgZGVjb2RpbmcgdGFibGUKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYjY0X3RhYmxlWzI1Nl0gPSB7CiAgICBbJ0EnXT0wLCAgWydCJ109MSwgIFsnQyddPTIsICBbJ0QnXT0zLCAgWydFJ109NCwgIFsnRiddPTUsICBbJ0cnXT02LCAgWydIJ109NywKICAgIFsnSSddPTgsICBbJ0onXT05LCAgWydLJ109MTAsIFsnTCddPTExLCBbJ00nXT0xMiwgWydOJ109MTMsIFsnTyddPTE0LCBbJ1AnXT0xNSwKICAgIFsnUSddPTE2LCBbJ1InXT0xNywgWydTJ109MTgsIFsnVCddPTE5LCBbJ1UnXT0yMCwgWydWJ109MjEsIFsnVyddPTIyLCBbJ1gnXT0yMywKICAgIFsnWSddPTI0LCBbJ1onXT0yNSwKICAgIFsnYSddPTI2LCBbJ2InXT0yNywgWydjJ109MjgsIFsnZCddPTI5LCBbJ2UnXT0zMCwgWydmJ109MzEsIFsnZyddPTMyLCBbJ2gnXT0zMywKICAgIFsnaSddPTM0LCBbJ2onXT0zNSwgWydrJ109MzYsIFsnbCddPTM3LCBbJ20nXT0zOCwgWyduJ109MzksIFsnbyddPTQwLCBbJ3AnXT00MSwKICAgIFsncSddPTQyLCBbJ3InXT00MywgWydzJ109NDQsIFsndCddPTQ1LCBbJ3UnXT00NiwgWyd2J109NDcsIFsndyddPTQ4LCBbJ3gnXT00OSwKICAgIFsneSddPTUwLCBbJ3onXT01MSwKICAgIFsnMCddPTUyLCBbJzEnXT01MywgWycyJ109NTQsIFsnMyddPTU1LCBbJzQnXT01NiwgWyc1J109NTcsIFsnNiddPTU4LCBbJzcnXT01OSwKICAgIFsnOCddPTYwLCBbJzknXT02MSwgWycrJ109NjIsIFsnLyddPTYzCn07CgovLyBEZWNvZGVzIEJhc2U2NCBzdHJpbmcgaW50byBvdXRwdXQgYnVmZmVyLCByZXR1cm5zIG91dHB1dCBsZW5ndGgKaW50IGJhc2U2NF9kZWNvZGUoY29uc3QgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkgewogICAgaW50IGxlbiA9IHN0cmxlbihpbik7CiAgICBpbnQgaSwgaiA9IDA7CiAgICB1bnNpZ25lZCBpbnQgdmFsID0gMDsKICAgIGludCB2YWxiID0gLTg7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBpbltpXTsKICAgICAgICBpZiAoaXNzcGFjZShjKSB8fCBjID09ICc9JykgY29udGludWU7CiAgICAgICAgaWYgKGMgPiAxMjcgfHwgYjY0X3RhYmxlW2NdID09IDAgJiYgYyAhPSAnQScpIGNvbnRpbnVlOyAvLyBza2lwIGludmFsaWQKICAgICAgICB2YWwgPSAodmFsIDw8IDYpICsgYjY0X3RhYmxlW2NdOwogICAgICAgIHZhbGIgKz0gNjsKICAgICAgICBpZiAodmFsYiA+PSAwKSB7CiAgICAgICAgICAgIG91dFtqKytdID0gKHZhbCA+PiB2YWxiKSAmIDB4RkY7CiAgICAgICAgICAgIHZhbGIgLT0gODsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKfQoKaW50IG1haW4oKSB7CiAgICAvLyBCYXNlNjQgc3RyaW5nIGNvbnRhaW5pbmcgIlVTNERxIgogICAgY29uc3QgY2hhciAqYjY0ID0gIlVTNERxOVJkbTA1UngvWjc5UnpIajZScUdIZE8rSU5JL3NWSmZzcE85akpVSm1IS1BsUUgwbUVPbFN2c1UiOwogICAgdW5zaWduZWQgY2hhciBkZWNvZGVkWzEyOF07CiAgICBpbnQgb3V0X2xlbiwgaTsKCiAgICBvdXRfbGVuID0gYmFzZTY0X2RlY29kZShiNjQsIGRlY29kZWQpOwoKICAgIHByaW50ZigiRGVjb2RlZCAlZCBieXRlczpcbiIsIG91dF9sZW4pOwogICAgZm9yIChpID0gMDsgaSA8IG91dF9sZW47ICsraSkgewogICAgICAgIHByaW50ZigiQnl0ZSAlM2Q6IDB4JTAyWCIsIGksIGRlY29kZWRbaV0pOwogICAgICAgIGlmIChkZWNvZGVkW2ldID09IDB4MDAgfHwgZGVjb2RlZFtpXSA9PSAweDA0IHx8IGRlY29kZWRbaV0gPT0gMHgxQSkgewogICAgICAgICAgICBwcmludGYoIiAgPC0tIHByb2JsZW1hdGljIGJ5dGUiKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQogICAgcmV0dXJuIDA7Cn0K