诸暨麻将添加redis
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

164 lines
4.2 KiB

  1. #include "stdafx.h"
  2. #include "Base64.h"
  3. #include <string.h>
  4. namespace zl{
  5. namespace util{
  6. static size_t base64EncodeImpl(const char *src, size_t len, std::string& dst);
  7. static size_t base64DecodeImpl(const char *src, size_t len, std::string& dst);
  8. size_t base64Encode(const char *src, size_t len, char *dst)
  9. {
  10. std::string dest;
  11. int size = base64EncodeImpl(src, len, dest);
  12. //strncpy(dst, dest.data(), size);
  13. ::memcpy(dst, dest.data(), size);
  14. return size;
  15. }
  16. size_t base64Encode(const char *src, size_t len, std::string& dst)
  17. {
  18. return base64EncodeImpl(src, len, dst);
  19. }
  20. size_t base64Encode(const std::string& src, std::string& dst)
  21. {
  22. return base64EncodeImpl(src.data(), src.size(), dst);
  23. }
  24. std::string base64Encode(const char *src, size_t len)
  25. {
  26. std::string dst;
  27. base64EncodeImpl(src, len, dst);
  28. return dst;
  29. }
  30. std::string base64Encode(const std::string& src)
  31. {
  32. std::string dst;
  33. base64EncodeImpl(src.data(), src.size(), dst);
  34. return dst;
  35. }
  36. size_t base64Decode(const char *src, size_t len, char *dst)
  37. {
  38. std::string dest;
  39. int size = base64DecodeImpl(src, len, dest);
  40. ::memcpy(dst, dest.c_str(), size);
  41. return size;
  42. }
  43. size_t base64Decode(const char *src, size_t len, std::string& dst)
  44. {
  45. return base64DecodeImpl(src, len, dst);
  46. }
  47. size_t base64Decode(const std::string& src, std::string& dst)
  48. {
  49. return base64DecodeImpl(src.data(), src.size(), dst);
  50. }
  51. std::string base64Decode(const char *src, size_t len)
  52. {
  53. std::string dst;
  54. base64DecodeImpl(src, len, dst);
  55. return dst;
  56. }
  57. std::string base64Decode(const std::string& src)
  58. {
  59. std::string dst;
  60. base64DecodeImpl(src.data(), src.size(), dst);
  61. return dst;
  62. }
  63. static size_t base64EncodeImpl(const char *src, size_t len, std::string& dst)
  64. {
  65. //������
  66. static const char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  67. unsigned char Tmp[4] = { 0 };
  68. int LineLength = 0;
  69. for (int i = 0; i<(int)(len / 3); i++)
  70. {
  71. Tmp[1] = *src++;
  72. Tmp[2] = *src++;
  73. Tmp[3] = *src++;
  74. dst += EncodeTable[Tmp[1] >> 2];
  75. dst += EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
  76. dst += EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
  77. dst += EncodeTable[Tmp[3] & 0x3F];
  78. if (LineLength += 4, LineLength == 76) { dst += "\r\n"; LineLength = 0; }
  79. }
  80. //��ʣ�����ݽ��б���
  81. int Mod = len % 3;
  82. if (Mod == 1)
  83. {
  84. Tmp[1] = *src++;
  85. dst += EncodeTable[(Tmp[1] & 0xFC) >> 2];
  86. dst += EncodeTable[((Tmp[1] & 0x03) << 4)];
  87. dst += "==";
  88. }
  89. else if (Mod == 2)
  90. {
  91. Tmp[1] = *src++;
  92. Tmp[2] = *src++;
  93. dst += EncodeTable[(Tmp[1] & 0xFC) >> 2];
  94. dst += EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
  95. dst += EncodeTable[((Tmp[2] & 0x0F) << 2)];
  96. dst += "=";
  97. }
  98. return dst.size();
  99. }
  100. static size_t base64DecodeImpl(const char *src, size_t len, std::string& dst)
  101. {
  102. //������
  103. static const char DecodeTable[] =
  104. {
  105. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  106. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  107. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63,
  108. 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0,
  109. 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  110. 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0,
  111. 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  112. 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0
  113. };
  114. int nValue = 0;
  115. size_t i = 0;
  116. while (i < len)
  117. {
  118. if (*src != '\r' && *src != '\n')
  119. {
  120. nValue = DecodeTable[(int)*src++] << 18;
  121. nValue += DecodeTable[(int)*src++] << 12;
  122. dst += (nValue & 0x00FF0000) >> 16;
  123. if (*src != '=')
  124. {
  125. nValue += DecodeTable[(int)*src++] << 6;
  126. dst += (nValue & 0x0000FF00) >> 8;
  127. if (*src != '=')
  128. {
  129. nValue += DecodeTable[(int)*src++];
  130. dst += nValue & 0x000000FF;
  131. }
  132. }
  133. i += 4;
  134. }
  135. else // �س�����,����
  136. {
  137. src++;
  138. i++;
  139. }
  140. }
  141. return dst.size();
  142. }
  143. }
  144. }