KSG_EncodeDecode.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FileName    :   KSG_EncodeDecode.cpp
  4. //  Version     :   1.0
  5. //  Creater     :   
  6. //  Date        :   2003-6-3 10:28:57
  7. //  Comment     :   
  8. //
  9. //////////////////////////////////////////////////////////////////////////////////////
  10. #include "KSG_EncodeDecode.h"
  11. int KSG_DecodeEncode(size_t uSize, unsigned char *pbyBuf, unsigned *puKey)
  12. {
  13.     unsigned *puBuf = (unsigned *)pbyBuf;
  14.     unsigned uKey = *puKey;
  15.     unsigned uRemainSize = uSize % 4;
  16.     uSize /= 4;
  17.     while (uSize-- > 0)
  18.         *puBuf++ ^= uKey;
  19.     pbyBuf = (unsigned char *)puBuf;
  20.     
  21.     while (uRemainSize-- > 0)
  22.     {
  23.         *pbyBuf++ ^= (unsigned char)(uKey & 0xff);
  24.         uKey >>= 8;
  25.     }
  26.     *puKey = (*puKey * 31) + 134775813L;
  27.     return true;
  28. }
  29. #ifdef WIN32
  30. int KSG_DecodeEncode_ASM(size_t uSize, unsigned char *pbyBuf, unsigned *puKey)
  31. {
  32.     __asm mov eax, [uSize]
  33.     __asm mov esi, [puKey]
  34.     __asm mov edi, [pbyBuf]
  35.     __asm mov ecx, eax
  36.     __asm mov edx, [esi]        // key
  37.     __asm shr eax, 2
  38.     __asm jz  Next1
  39.    
  40.     Loop1:
  41.     __asm mov ebx, [edi]
  42.     __asm add edi, 4
  43.     __asm xor ebx, edx
  44.     __asm dec eax
  45.     __asm mov [edi - 4], ebx
  46.     __asm jnz Loop1
  47.     Next1:
  48.     __asm and ecx, 3
  49.     __asm mov eax, edx  // Key
  50.     __asm jz Next2
  51.     Loop2:
  52.     __asm mov bl, [edi]
  53.     __asm inc edi
  54.     __asm xor bl, al
  55.     __asm shr eax, 8
  56.     __asm mov [edi - 1], bl
  57.     __asm dec ecx
  58.     __asm jnz Loop2
  59.     Next2:
  60.     __asm mov eax, edx      // NewKey = OldKey * 31 +  134775813L
  61.     __asm shl edx, 5
  62.     __asm sub edx, eax
  63.     __asm add edx, 134775813    // 08088405H
  64.     __asm mov [esi], edx
  65.     return true;
  66. }
  67. #endif
  68. int KSG_DecodeBuf(size_t uSize, unsigned char *pbyBuf, unsigned *puKey)
  69. {
  70. //    _ASSERT(uSize);
  71. //    _ASSERT(pbyBuf);
  72. //    _ASSERT(puKey);
  73. unsigned uKey = *puKey;
  74. #ifdef WIN32
  75.     return KSG_DecodeEncode(uSize, pbyBuf, &uKey);
  76. #else
  77.     return KSG_DecodeEncode(uSize, pbyBuf, &uKey);
  78. #endif
  79. }
  80. int KSG_EncodeBuf(size_t uSize, unsigned char *pbyBuf, unsigned *puKey)
  81. {
  82. //    _ASSERT(uSize);
  83. //    _ASSERT(pbyBuf);
  84. //    _ASSERT(puKey);
  85. unsigned uKey = *puKey;
  86. #ifdef WIN32
  87.     return KSG_DecodeEncode(uSize, pbyBuf, &uKey);
  88. #else
  89.     return KSG_DecodeEncode(uSize, pbyBuf, &uKey);
  90. #endif
  91. }