test_encode.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:3k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <stdio.h>
  3. static unsigned char Decode6BitMask[5] = { 0xfc, 0xf8, 0xf0, 0xe0, 0xc0 };
  4. typedef struct tag_TDEFAULTMESSAGE
  5. {
  6. int nRecog;
  7. WORD wIdent;
  8. WORD wParam;
  9. WORD wTag;
  10. WORD wSeries;
  11. } _TDEFAULTMESSAGE, *_LPTDEFAULTMESSAGE;
  12. int memlen(const char *str)
  13. {
  14.     const char *eos = str;
  15.     while(*eos++);
  16.     return((int)(eos - str));
  17. }
  18. /* **************************************************************************************
  19. Encode/Decode Routine for ANSI character
  20.    ************************************************************************************** */
  21. int WINAPI fnEncode6BitBufA(unsigned char *pszSrc, char *pszDest, int nSrcLen, int nDestLen)
  22. {
  23. int nDestPos = 0;
  24. int nRestCount = 0;
  25. unsigned char chMade = 0, chRest = 0;
  26. for (int i = 0; i < nSrcLen; i++)
  27. {
  28. if (nDestPos >= nDestLen) break;
  29. chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
  30. chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f);
  31. nRestCount += 2;
  32. if (nRestCount < 6)
  33. pszDest[nDestPos++] = chMade + 0x3c;
  34. else
  35. {
  36. if (nDestPos < nDestLen - 1)
  37. {
  38. pszDest[nDestPos++] = chMade + 0x3c;
  39. pszDest[nDestPos++] = chRest + 0x3c;
  40. }
  41. else
  42. pszDest[nDestPos++] = chMade + 0x3c;
  43. nRestCount = 0;
  44. chRest = 0;
  45. }
  46. }
  47. if (nRestCount > 0)
  48. pszDest[nDestPos++] = chRest + 0x3c;
  49. // pszDest[nDestPos] = '';
  50. return nDestPos;
  51. }
  52. int  WINAPI fnDecode6BitBufA(char *pszSrc, char *pszDest, int nDestLen)
  53. {
  54. int nLen = memlen((const char *)pszSrc) - 1;
  55. int nDestPos = 0, nBitPos = 2;
  56. int nMadeBit = 0;
  57. unsigned char ch, chCode, tmp;
  58. for (int i = 0; i < nLen; i++)
  59. {
  60. if ((pszSrc[i] - 0x3c) >= 0)
  61. ch = pszSrc[i] - 0x3c;
  62. else
  63. {
  64. nDestPos = 0;
  65. break;
  66. }
  67. if (nDestPos >= nDestLen) break;
  68. if ((nMadeBit + 6) >= 8)
  69. {
  70. chCode = (tmp | ((ch & 0x3f) >> (6 - nBitPos)));
  71. pszDest[nDestPos++] = chCode;
  72. nMadeBit = 0;
  73. if (nBitPos < 6) 
  74. nBitPos += 2;
  75. else
  76. {
  77. nBitPos = 2;
  78. continue;
  79. }
  80. }
  81. tmp = ((ch << nBitPos) & Decode6BitMask[nBitPos - 2]);
  82. nMadeBit += (8 - nBitPos);
  83. }
  84. // pszDest[nDestPos] = '';
  85. return nDestPos;
  86. }
  87. int WINAPI fnEncodeMessageA(_LPTDEFAULTMESSAGE lptdm, char *pszBuf, int nLen)
  88. { return fnEncode6BitBufA((unsigned char *)lptdm, pszBuf, sizeof(_TDEFAULTMESSAGE), nLen); }
  89. void  WINAPI fnDecodeMessageA(_LPTDEFAULTMESSAGE lptdm, char *pszBuf)
  90. { fnDecode6BitBufA(pszBuf, (char *)lptdm, sizeof(_TDEFAULTMESSAGE)); }
  91. void main()
  92. {
  93. _TDEFAULTMESSAGE DefMsg;
  94. _TDEFAULTMESSAGE DefMsg2;
  95. char szMsg[256];
  96. ZeroMemory(&DefMsg, sizeof(DefMsg));
  97. DefMsg.wSeries = MAKEWORD(2, 11);
  98. fnEncodeMessageA(&DefMsg, szMsg, sizeof(szMsg));
  99. fnDecodeMessageA(&DefMsg2, szMsg);
  100. printf("%d, %d", HIBYTE(DefMsg2.wSeries), LOBYTE(DefMsg2.wSeries));
  101. printf("%dn", sizeof(_TDEFAULTMESSAGE));
  102. }