EnDecode.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:2k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // EnDecode.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. static unsigned char Decode6BitMask[5] = { 0xfc, 0xf8, 0xf0, 0xe0, 0xc0 };
  5. int WINAPI fnEncode6BitBuf(unsigned char *pszSrc, char *pszDest, int nSrcLen, int nDestLen)
  6. {
  7. int nDestPos = 0;
  8. int nRestCount = 0;
  9. unsigned char chMade = 0, chRest = 0;
  10. for (int i = 0; i < nSrcLen; i++)
  11. {
  12. if (nDestPos >= nDestLen) break;
  13. chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
  14. chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f);
  15. nRestCount += 2;
  16. if (nRestCount < 6)
  17. pszDest[nDestPos++] = chMade + 0x3c;
  18. else
  19. {
  20. if (nDestPos < nDestLen - 1)
  21. {
  22. pszDest[nDestPos++] = chMade + 0x3c;
  23. pszDest[nDestPos++] = chRest + 0x3c;
  24. }
  25. else
  26. pszDest[nDestPos++] = chMade + 0x3c;
  27. nRestCount = 0;
  28. chRest = 0;
  29. }
  30. }
  31. if (nRestCount > 0)
  32. pszDest[nDestPos++] = chRest + 0x3c;
  33. pszDest[nDestPos] = '';
  34. return nDestPos;
  35. }
  36. int  WINAPI fnDecode6BitBuf(char *pszSrc, char *pszDest, int nDestLen)
  37. {
  38. int nLen = strlen((const char *)pszSrc);
  39. int nDestPos = 0, nBitPos = 2;
  40. int nMadeBit = 0;
  41. unsigned char ch, chCode, tmp;
  42. for (int i = 0; i < nLen; i++)
  43. {
  44. if ((pszSrc[i] - 0x3c) >= 0)
  45. ch = pszSrc[i] - 0x3c;
  46. else
  47. {
  48. nDestPos = 0;
  49. break;
  50. }
  51. if (nDestPos >= nDestLen) break;
  52. if ((nMadeBit + 6) >= 8)
  53. {
  54. chCode = (tmp | ((ch & 0x3f) >> (6 - nBitPos)));
  55. pszDest[nDestPos++] = chCode;
  56. nMadeBit = 0;
  57. if (nBitPos < 6) 
  58. nBitPos += 2;
  59. else
  60. {
  61. nBitPos = 2;
  62. continue;
  63. }
  64. }
  65. tmp = ((ch << nBitPos) & Decode6BitMask[nBitPos - 2]);
  66. nMadeBit += (8 - nBitPos);
  67. }
  68. // pszDest[nDestPos] = '';
  69. return nDestPos;
  70. }
  71. int WINAPI fnEncodeMessage(_LPTDEFAULTMESSAGE lptdm, char *pszBuf, int nLen)
  72. {
  73. unsigned char btBuffer[32];
  74. memcpy(btBuffer, (void *)lptdm, sizeof(_TDEFAULTMESSAGE));
  75. return fnEncode6BitBuf(btBuffer, pszBuf, sizeof(_TDEFAULTMESSAGE), nLen);
  76. }
  77. int  WINAPI fnDecodeMessage(_LPTDEFAULTMESSAGE lptdm, char *pszBuf)
  78. { return fnDecode6BitBuf(pszBuf, (char *)lptdm, sizeof(_TDEFAULTMESSAGE)); }
  79. void WINAPI fnMakeDefMessage(_LPTDEFAULTMESSAGE lptdm, WORD wIdent, int nRecog, WORD wParam, WORD wTag, WORD wSeries)
  80. { lptdm->wIdent = wIdent; lptdm->nRecog = nRecog; lptdm->wParam = wParam; lptdm->wTag = wTag; lptdm->wSeries = wSeries; }