EnDecode.cpp
上传用户:tt_chan
上传日期:2009-12-03
资源大小:4523k
文件大小:4k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // EnDecode.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. static unsigned char Decode6BitMask[5] = { 0xff, 0xfe, 0xfd, 0xec, 0xcd };
  5. /* **************************************************************************************
  6. Encode/Decode Routine for UNICODE character
  7.    ************************************************************************************** */
  8. #ifdef _UNICODE
  9. int WINAPI fnEncode6BitBufW(unsigned char *pszSrc, TCHAR *pszDest, int nSrcLen, int nDestLen)
  10. {
  11. int nDestPos = 0;
  12. int nRestCount = 0;
  13. unsigned char chMade = 0, chRest = 0;
  14. for (int i = 0; i < nSrcLen; i++)
  15. {
  16. if (nDestPos >= nDestLen) break;
  17. chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
  18. chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f);
  19. nRestCount += 2;
  20. if (nRestCount < 6)
  21. pszDest[nDestPos++] = chMade + 0x3c;
  22. else
  23. {
  24. if (nDestPos < nDestLen - 1)
  25. {
  26. pszDest[nDestPos++] = chMade + 0x3c;
  27. pszDest[nDestPos++] = chRest + 0x3c;
  28. }
  29. else
  30. pszDest[nDestPos++] = chMade + 0x3c;
  31. nRestCount = 0;
  32. chRest = 0;
  33. }
  34. }
  35. if (nRestCount > 0)
  36. pszDest[nDestPos++] = chRest + 0x3c;
  37. pszDest[nDestPos] = L'';
  38. return nDestPos;
  39. }
  40. int  WINAPI fnDecode6BitBufW(TCHAR *pwszSrc, char *pszDest, int nDestLen)
  41. {
  42. int nLen = lstrlen(pwszSrc);
  43. int nDestPos = 0, nBitPos = 2;
  44. int nMadeBit = 0;
  45. unsigned char ch, chCode, tmp;
  46. char *pszSrc = new char[nLen + 1];
  47. WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszSrc, sizeof(pszSrc), NULL, NULL);
  48. for (int i = 0; i < nLen; i++)
  49. {
  50. if ((pszSrc[i] - 0x3c) >= 0)
  51. ch = pszSrc[i] - 0x3c;
  52. else
  53. {
  54. nDestPos = 0;
  55. break;
  56. }
  57. if (nDestPos >= nDestLen) break;
  58. if ((nMadeBit + 6) >= 8)
  59. {
  60. chCode = (tmp | ((ch & 0x3f) >> (6 - nBitPos)));
  61. pszDest[nDestPos++] = chCode;
  62. nMadeBit = 0;
  63. if (nBitPos < 6) 
  64. nBitPos += 2;
  65. else
  66. {
  67. nBitPos = 2;
  68. continue;
  69. }
  70. }
  71. tmp = ((ch << nBitPos) & Decode6BitMask[nBitPos - 2]);
  72. nMadeBit += (8 - nBitPos);
  73. }
  74. pszDest[nDestPos] = '';
  75. delete [] pszSrc;
  76. return i;
  77. }
  78. int WINAPI fnEncodeMessageW(_LPTDEFAULTMESSAGE lptdm, TCHAR *pszBuf, int nLen)
  79. {
  80. unsigned char btBuffer[32];
  81. memcpy(btBuffer, (void *)lptdm, sizeof(_TDEFAULTMESSAGE));
  82. return fnEncode6BitBuf(btBuffer, pszBuf, sizeof(_TDEFAULTMESSAGE), nLen);
  83. }
  84. #endif
  85. /* **************************************************************************************
  86. Encode/Decode Routine for ANSI character
  87.    ************************************************************************************** */
  88. int WINAPI fnEncode6BitBufA(unsigned char *pszSrc, char *pszDest, int nSrcLen, int nDestLen)
  89. {
  90. int nDestPos = 0;
  91. int nRestCount = 0;
  92. unsigned char chMade = 0, chRest = 0;
  93. for (int i = 0; i < nSrcLen; i++)
  94. {
  95. if (nDestPos >= nDestLen) break;
  96. chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
  97. chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f);
  98. nRestCount += 2;
  99. if (nRestCount < 6)
  100. pszDest[nDestPos++] = chMade + 0x3c;
  101. else
  102. {
  103. if (nDestPos < nDestLen - 1)
  104. {
  105. pszDest[nDestPos++] = chMade + 0x3c;
  106. pszDest[nDestPos++] = chRest + 0x3c;
  107. }
  108. else
  109. pszDest[nDestPos++] = chMade + 0x3c;
  110. nRestCount = 0;
  111. chRest = 0;
  112. }
  113. }
  114. if (nRestCount > 0)
  115. pszDest[nDestPos++] = chRest + 0x3c;
  116. // pszDest[nDestPos] = '';
  117. return nDestPos;
  118. }
  119. int  WINAPI fnDecode6BitBufA(char *pszSrc, char *pszDest, int nDestLen)
  120. {
  121. int nLen = memlen((const char *)pszSrc) - 1;
  122. int nDestPos = 0, nBitPos = 2;
  123. int nMadeBit = 0;
  124. unsigned char ch, chCode, tmp;
  125. for (int i = 0; i < nLen; i++)
  126. {
  127. if ((pszSrc[i] - 0x3c) >= 0)
  128. ch = pszSrc[i] - 0x3c;
  129. else
  130. {
  131. nDestPos = 0;
  132. break;
  133. }
  134. if (nDestPos >= nDestLen) break;
  135. if ((nMadeBit + 6) >= 8)
  136. {
  137. chCode = (tmp | ((ch & 0x3f) >> (6 - nBitPos)));
  138. pszDest[nDestPos++] = chCode;
  139. nMadeBit = 0;
  140. if (nBitPos < 6) 
  141. nBitPos += 2;
  142. else
  143. {
  144. nBitPos = 2;
  145. continue;
  146. }
  147. }
  148. tmp = ((ch << nBitPos) & Decode6BitMask[nBitPos - 2]);
  149. nMadeBit += (8 - nBitPos);
  150. }
  151. // pszDest[nDestPos] = '';
  152. return nDestPos;
  153. }
  154. int WINAPI fnEncodeMessageA(_LPTDEFAULTMESSAGE lptdm, char *pszBuf, int nLen)
  155. { return fnEncode6BitBufA((unsigned char *)lptdm, pszBuf, sizeof(_TDEFAULTMESSAGE), nLen); }