SHARE
TWEET

c base64 encoder

dylanweber Apr 4th, 2015 (edited) 260 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top