Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Here's the one I'm using:</p> <pre><code>#include &lt;stdint.h&gt; #include &lt;stdlib.h&gt; static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; static char *decoding_table = NULL; static int mod_table[] = {0, 2, 1}; char *base64_encode(const unsigned char *data, size_t input_length, size_t *output_length) { *output_length = 4 * ((input_length + 2) / 3); char *encoded_data = malloc(*output_length); if (encoded_data == NULL) return NULL; for (int i = 0, j = 0; i &lt; input_length;) { uint32_t octet_a = i &lt; input_length ? (unsigned char)data[i++] : 0; uint32_t octet_b = i &lt; input_length ? (unsigned char)data[i++] : 0; uint32_t octet_c = i &lt; input_length ? (unsigned char)data[i++] : 0; uint32_t triple = (octet_a &lt;&lt; 0x10) + (octet_b &lt;&lt; 0x08) + octet_c; encoded_data[j++] = encoding_table[(triple &gt;&gt; 3 * 6) &amp; 0x3F]; encoded_data[j++] = encoding_table[(triple &gt;&gt; 2 * 6) &amp; 0x3F]; encoded_data[j++] = encoding_table[(triple &gt;&gt; 1 * 6) &amp; 0x3F]; encoded_data[j++] = encoding_table[(triple &gt;&gt; 0 * 6) &amp; 0x3F]; } for (int i = 0; i &lt; mod_table[input_length % 3]; i++) encoded_data[*output_length - 1 - i] = '='; return encoded_data; } unsigned char *base64_decode(const char *data, size_t input_length, size_t *output_length) { if (decoding_table == NULL) build_decoding_table(); if (input_length % 4 != 0) return NULL; *output_length = input_length / 4 * 3; if (data[input_length - 1] == '=') (*output_length)--; if (data[input_length - 2] == '=') (*output_length)--; unsigned char *decoded_data = malloc(*output_length); if (decoded_data == NULL) return NULL; for (int i = 0, j = 0; i &lt; input_length;) { uint32_t sextet_a = data[i] == '=' ? 0 &amp; i++ : decoding_table[data[i++]]; uint32_t sextet_b = data[i] == '=' ? 0 &amp; i++ : decoding_table[data[i++]]; uint32_t sextet_c = data[i] == '=' ? 0 &amp; i++ : decoding_table[data[i++]]; uint32_t sextet_d = data[i] == '=' ? 0 &amp; i++ : decoding_table[data[i++]]; uint32_t triple = (sextet_a &lt;&lt; 3 * 6) + (sextet_b &lt;&lt; 2 * 6) + (sextet_c &lt;&lt; 1 * 6) + (sextet_d &lt;&lt; 0 * 6); if (j &lt; *output_length) decoded_data[j++] = (triple &gt;&gt; 2 * 8) &amp; 0xFF; if (j &lt; *output_length) decoded_data[j++] = (triple &gt;&gt; 1 * 8) &amp; 0xFF; if (j &lt; *output_length) decoded_data[j++] = (triple &gt;&gt; 0 * 8) &amp; 0xFF; } return decoded_data; } void build_decoding_table() { decoding_table = malloc(256); for (int i = 0; i &lt; 64; i++) decoding_table[(unsigned char) encoding_table[i]] = i; } void base64_cleanup() { free(decoding_table); } </code></pre> <p>Keep in mind that this doesn't do any error-checking while decoding - non base 64 encoded data will get processed.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload