Advertisement
dylanweber

c base64 encoder

Apr 4th, 2015
453
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. char *base64encode(char *input);
  7.  
  8. int main(int argc, char **argv) {
  9.     if (argc != 2) {
  10.         printf("Usage: example ... text\r\n");
  11.         return 1;
  12.     }
  13.     char *text = argv[1];
  14.     char *encoded_text = base64encode(text);
  15.     printf("Input String: \"%s\"\r\nOutput String: \"%s\"\r\n", text, encoded_text);
  16.     free(encoded_text);
  17.     return 0;
  18. }
  19.  
  20. char *base64encode(char *input) {
  21.     int len = strlen(input), padding = (len % 3)?3 - (len % 3):0, n, xlen = 0;
  22.     size_t bitlen = len * 8;
  23.     uint8_t *x = malloc(((int)(bitlen / 24) * 4) + ((padding)?4:0)), i, o;
  24.     for (n = 0; n < len; n++) {
  25.         switch (n % 3) {
  26.             case 0:
  27.                 i = (uint8_t)(input[n] >> 2);
  28.                 x[xlen++] = i;
  29.                 break;
  30.             case 1:
  31.                 i = (uint8_t)((input[n-1] & 3) << 4);
  32.                 o = (uint8_t)((input[n] & 240) >> 4);
  33.                 x[xlen++] = i | o;
  34.                 break;
  35.             case 2:
  36.                 i = (uint8_t)((input[n-1] & 15) << 2);
  37.                 o = (uint8_t)((input[n] & 192) >> 6);
  38.                 x[xlen++] = i | o;
  39.                 i = (uint8_t)(input[n] & 63);
  40.                 x[xlen++] = i;
  41.                 break;
  42.         }
  43.         if ((len - n) == ((padding==2)?2:3) && padding > 0) {
  44.             n++;
  45.             break;
  46.         }
  47.     }
  48.     if (padding == 2) {
  49.         i = (uint8_t)(input[n] >> 2);
  50.         x[xlen++] = i;
  51.         i = (uint8_t)((input[n] & 3) << 4);
  52.         x[xlen++] = i;
  53.     } else if (padding == 1) {
  54.         i = (uint8_t)(input[n] >> 2);
  55.         x[xlen++] = i;
  56.         i = (uint8_t)((input[n] & 3) << 4);
  57.         o = (uint8_t)((input[n+1] & 240) >> 4);
  58.         x[xlen++] = i | o;
  59.         i = (uint8_t)((input[n+1] & 15) << 2);
  60.         x[xlen++] = i;
  61.     }
  62.     const char *index = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  63.     char *returnString = malloc((int)((bitlen / 24) + padding) * 4 + 1);
  64.     for (n = 0; n < ((int)(bitlen / 24) * 4) + ((padding)?4:0) - padding; n++) {
  65.         returnString[n] = index[x[n]];
  66.     }
  67.     free(x);
  68.     for (;padding > 0; padding--) {
  69.         returnString[n++] = '=';
  70.     }
  71.     returnString[n] = '\0';
  72.     return returnString;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement