诸暨麻将添加redis
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

183 строки
4.4 KiB

  1. #include "StdAfx.h"
  2. #include "ZBase64.h"
  3. static const CHAR* DATA_BIN2ASCII = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  4. INT BASE64_Encode(const BYTE* inputBuffer, INT inputCount, TCHAR* outputBuffer)
  5. {
  6. INT i;
  7. BYTE b0, b1, b2;
  8. if ((inputBuffer == NULL) || (inputCount < 0))
  9. {
  10. return -1; // 参数错误
  11. }
  12. if (outputBuffer != NULL)
  13. {
  14. for (i = inputCount; i > 0; i -= 3)
  15. {
  16. if (i >= 3)
  17. { // 将3字节数据转换成4个ASCII字符
  18. b0 = *inputBuffer++;
  19. b1 = *inputBuffer++;
  20. b2 = *inputBuffer++;
  21. *outputBuffer++ = DATA_BIN2ASCII[b0 >> 2];
  22. *outputBuffer++ = DATA_BIN2ASCII[((b0 << 4) | (b1 >> 4)) & 0x3F];
  23. *outputBuffer++ = DATA_BIN2ASCII[((b1 << 2) | (b2 >> 6)) & 0x3F];
  24. *outputBuffer++ = DATA_BIN2ASCII[b2 & 0x3F];
  25. }
  26. else
  27. {
  28. b0 = *inputBuffer++;
  29. if (i == 2)b1 = *inputBuffer++; else b1 = 0;
  30. *outputBuffer++ = DATA_BIN2ASCII[b0 >> 2];
  31. *outputBuffer++ = DATA_BIN2ASCII[((b0 << 4) | (b1 >> 4)) & 0x3F];
  32. *outputBuffer++ = (i == 1) ? TEXT('=') : DATA_BIN2ASCII[(b1 << 2) & 0x3F];
  33. *outputBuffer++ = TEXT('=');
  34. }
  35. } // End for i
  36. *outputBuffer++ = TEXT('/0'); // 添加字符串结束标记
  37. }
  38. return ((inputCount + 2) / 3) * 4; // 返回有效字符个数
  39. }
  40. #define B64_EOLN 0xF0 // 换行/n
  41. #define B64_CR 0xF1 // 回车/r
  42. #define B64_EOF 0xF2 // 连字符-
  43. #define B64_WS 0xE0 // 跳格或者空格(/t、space)
  44. #define B64_ERROR 0xFF // 错误字符
  45. #define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3)
  46. static const BYTE DATA_ASCII2BIN[128] = {
  47. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF,
  48. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  49. 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xF2, 0xFF, 0x3F,
  50. 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
  51. 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
  52. 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  53. 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
  54. 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  55. };
  56. INT BASE64_Decode(const TCHAR* inputBuffer, INT inputCount, BYTE* outputBuffer)
  57. {
  58. INT i, j;
  59. BYTE b[4];
  60. TCHAR ch;
  61. if ((inputBuffer == NULL) || (inputCount < 0))
  62. {
  63. return -1; // 参数错误
  64. }
  65. // 去除头部空白字符
  66. while (inputCount > 0)
  67. {
  68. ch = *inputBuffer;
  69. if ((ch < 0) || (ch >= 0x80))
  70. {
  71. return -2; // 数据错误,不在ASCII字符编码范围内
  72. }
  73. else
  74. {
  75. if (DATA_ASCII2BIN[ch] == B64_WS)
  76. {
  77. inputBuffer++;
  78. inputCount--;
  79. }
  80. else
  81. {
  82. break;
  83. }
  84. }
  85. }
  86. // 去除尾部的空白字符、回车换行字符、连字符
  87. while (inputCount >= 4)
  88. {
  89. ch = inputBuffer[inputCount - 1];
  90. if ((ch < 0) || (ch >= 0x80))
  91. {
  92. return -2; // 数据错误,不在ASCII字符编码范围内
  93. }
  94. else
  95. {
  96. if (B64_NOT_BASE64(DATA_ASCII2BIN[ch]))
  97. {
  98. inputCount--;
  99. }
  100. else
  101. {
  102. break;
  103. }
  104. }
  105. }
  106. // 字符串长度必须为4的倍数
  107. if ((inputCount % 4) != 0)
  108. {
  109. return -2; // 数据错误
  110. }
  111. if (outputBuffer != NULL)
  112. {
  113. for (i = 0; i < inputCount; i += 4)
  114. {
  115. for (j = 0; j < 4; j++)
  116. {
  117. ch = *inputBuffer++;
  118. if ((ch < 0) || (ch >= 0x80))
  119. {
  120. return -2; // 数据错误,不在ASCII字符编码范围内
  121. }
  122. else
  123. {
  124. if (ch == '=') // 发现BASE64编码中的填充字符
  125. {
  126. break;
  127. }
  128. else
  129. {
  130. b[j] = DATA_ASCII2BIN[ch];
  131. if (b[j] & 0x80)
  132. {
  133. return -2; // 数据错误,无效的Base64编码字符
  134. }
  135. }
  136. }
  137. } // End for j
  138. if (j == 4)
  139. {
  140. *outputBuffer++ = (b[0] << 2) | (b[1] >> 4);
  141. *outputBuffer++ = (b[1] << 4) | (b[2] >> 2);
  142. *outputBuffer++ = (b[2] << 6) | b[3];
  143. }
  144. else if (j == 3)
  145. { // 有1个填充字节
  146. *outputBuffer++ = (b[0] << 2) | (b[1] >> 4);
  147. *outputBuffer++ = (b[1] << 4) | (b[2] >> 2);
  148. return (i >> 2) * 3 + 2;
  149. }
  150. else if (j == 2)
  151. { // 有2个填充字节
  152. *outputBuffer++ = (b[0] << 2) | (b[1] >> 4);
  153. return (i >> 2) * 3 + 1;
  154. }
  155. else
  156. {
  157. return -2; // 数据错误,无效的Base64编码字符
  158. }
  159. } // End for i
  160. }
  161. return (inputCount >> 2) * 3;
  162. }