Base64.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "Base64.h"
  2. #include <math.h>
  3. using namespace Framework;
  4. static Framework::Text base64_chars =
  5. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  6. "abcdefghijklmnopqrstuvwxyz"
  7. "0123456789+/";
  8. Text Framework::base64Encode(const char* data, int length)
  9. {
  10. Text result;
  11. int i = 0;
  12. int j = 0;
  13. unsigned char char_array_3[3];
  14. unsigned char char_array_4[4];
  15. while (length--)
  16. {
  17. char_array_3[i++] = *(data++);
  18. if (i == 3)
  19. {
  20. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  21. char_array_4[1] = (unsigned char)(((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4));
  22. char_array_4[2] = (unsigned char)(((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6));
  23. char_array_4[3] = char_array_3[2] & 0x3f;
  24. for (i = 0; (i < 4); i++)
  25. result.append((char)base64_chars[char_array_4[i]]);
  26. i = 0;
  27. }
  28. }
  29. if (i)
  30. {
  31. for (j = i; j < 3; j++)
  32. char_array_3[j] = '\0';
  33. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  34. char_array_4[1] = (unsigned char)(((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4));
  35. char_array_4[2] = (unsigned char)(((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6));
  36. char_array_4[3] = char_array_3[2] & 0x3f;
  37. for (j = 0; (j < i + 1); j++)
  38. result.append((char)base64_chars[char_array_4[j]]);
  39. while ((i++ < 3))
  40. result.append('=');
  41. }
  42. return result;
  43. }
  44. bool Framework::base64Decode(Text base64, char** data, int* length)
  45. {
  46. int i = 0;
  47. int j = 0;
  48. int k = 0;
  49. int l = 0;
  50. int n = 0;
  51. unsigned char char_array_4[4];
  52. unsigned char char_array_3[3];
  53. *length = 0;
  54. while (base64[l])
  55. {
  56. if (base64[l] == '=')
  57. break;
  58. if (!base64_chars.hat(base64[l]))
  59. return false;
  60. l++;
  61. }
  62. *length = (int)ceil(l / 4.f) * 3;
  63. *data = new char[*length + 1];
  64. while (base64[k])
  65. {
  66. char_array_4[i++] = base64[k];
  67. if (i == 4)
  68. {
  69. for (i = 0; i < 4; i++)
  70. char_array_4[i] = (unsigned char)(base64_chars.positionVon(char_array_4[i]));
  71. char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
  72. char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
  73. char_array_3[2] = (unsigned char)(((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
  74. for (i = 0; (i < 3); i++)
  75. (*data)[n++] = char_array_3[i];
  76. i = 0;
  77. }
  78. k++;
  79. }
  80. if (i)
  81. {
  82. for (j = i; j < 4; j++)
  83. char_array_4[j] = 0;
  84. for (j = 0; j < 4; j++)
  85. char_array_4[j] = (unsigned char)(base64_chars.positionVon(char_array_4[j]));
  86. char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
  87. char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
  88. char_array_3[2] = (unsigned char)(((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
  89. for (j = 0; (j < i - 1); j++)
  90. (*data)[n++] = char_array_3[j];
  91. }
  92. (*data)[*length] = '\0';
  93. return true;
  94. }