base64.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include <string.h>
  2. /*
  3. Public Base64 conversion tables
  4. */
  5. const char B64ABC[] =
  6. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  7. char b64buf[256];
  8. /*
  9. void initb64();
  10. Initializes the base64->base16 conversion tab.
  11. Call this function once when your program starts.
  12. and always after your B64 table has been changed.
  13. */
  14. void initb64()
  15. {
  16. unsigned int i;
  17. for (i = 0; i < 256; i++)
  18. b64buf[i] = 0x00;
  19. for (i = 0; i < 64; i++)
  20. b64buf[(int)(B64ABC[i])] = i;
  21. }
  22. /*
  23. int b64toh(lpBase64String, lpDestinationBuffer);
  24. Converts base64 string b to hexnumber d.
  25. Returns size of hexnumber in bytes.
  26. */
  27. int b64toh(const char *b, char *d)
  28. {
  29. unsigned int i, k, l;
  30. l = strlen(b);
  31. if (l < 2)
  32. return 0;
  33. for (i = l - 1; ; i--) {
  34. if (b64buf[(int)(b[i])] == 0)
  35. l--;
  36. else
  37. break;
  38. }
  39. if (l < 2)
  40. return 0;
  41. i = 0, k = 0;
  42. while (1) {
  43. i++;
  44. if (k + 1 < l)
  45. d[i - 1] = ((b64buf[(int)(b[k])]) << 2);
  46. else
  47. break;
  48. k++;
  49. if (k < l)
  50. d[i - 1] |= ((b64buf[(int)(b[k])]) >> 4);
  51. else
  52. break;
  53. i++;
  54. if (k + 1 < l)
  55. d[i - 1] = ((b64buf[(int)(b[k])]) << 4);
  56. else
  57. break;
  58. k++;
  59. if (k < l)
  60. d[i - 1] |= ((b64buf[(int)(b[k])]) >> 2);
  61. else
  62. break;
  63. i++;
  64. if (k + 1 < l)
  65. d[i - 1] = ((b64buf[(int)(b[k])]) << 6);
  66. else
  67. break;
  68. k++;
  69. if (k < l)
  70. d[i - 1] |= (b64buf[(int)(b[k])]);
  71. else
  72. break;
  73. k++;
  74. }
  75. return i - 1;
  76. }
  77. /*
  78. int htob64(lpHexNumber, lpDestinationBuffer);
  79. Converts hexnumber h (with length l bytes) to base64 string d.
  80. Returns length of base64 string.
  81. */
  82. int htob64(const char *h, char *d, unsigned int l)
  83. {
  84. unsigned int i, j, k;
  85. unsigned char m, t;
  86. if (!l)
  87. return 0;
  88. l <<= 3; // no. bits
  89. m = 0x80;
  90. for (i = 0, j = 0, k = 0, t = 0; i < l; i++) {
  91. if (h[(i >> 3)] & m)
  92. t |= 1;
  93. j++;
  94. if (!(m >>= 1))
  95. m = 0x80;
  96. if (!(j % 6)) {
  97. d[k] = B64ABC[t];
  98. t &= 0;
  99. k++;
  100. }
  101. t <<= 1;
  102. }
  103. m = 5 - (j % 6);
  104. t <<= m;
  105. if (m) {
  106. d[k] = B64ABC[t];
  107. k++;
  108. }
  109. d[k] &= 0;
  110. return (int)strlen(d);
  111. }