base64.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /****************************************************************************
  2. * Function to encode in Base64
  3. *
  4. * Written by Lauri Alanko
  5. *
  6. *****************************************************************************/
  7. #include "common.h"
  8. #include "base64.h"
  9. char *
  10. base64 (const char *bin, size_t len)
  11. {
  12. char *buf = (char *) malloc ((len + 2) / 3 * 4 + 1);
  13. size_t i = 0, j = 0;
  14. char BASE64_END = '=';
  15. char base64_table[64];
  16. strncpy (base64_table, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 64);
  17. while (j < len - 2) {
  18. buf[i++] = base64_table[bin[j] >> 2];
  19. buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
  20. buf[i++] = base64_table[((bin[j + 1] & 15) << 2) | (bin[j + 2] >> 6)];
  21. buf[i++] = base64_table[bin[j + 2] & 63];
  22. j += 3;
  23. }
  24. switch (len - j) {
  25. case 1:
  26. buf[i++] = base64_table[bin[j] >> 2];
  27. buf[i++] = base64_table[(bin[j] & 3) << 4];
  28. buf[i++] = BASE64_END;
  29. buf[i++] = BASE64_END;
  30. break;
  31. case 2:
  32. buf[i++] = base64_table[bin[j] >> 2];
  33. buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
  34. buf[i++] = base64_table[(bin[j + 1] & 15) << 2];
  35. buf[i++] = BASE64_END;
  36. break;
  37. case 0:
  38. break;
  39. }
  40. buf[i] = '\0';
  41. return buf;
  42. }