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

模拟服务器

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FileName    :   CRC32.C
  4. //  Creater     :   Freeway Chen
  5. //  Date        :   2000-6-15 18:25:43
  6. //  Comment     :   Get source code from Zlib Project
  7. //
  8. //////////////////////////////////////////////////////////////////////////////////////
  9. /* crc32.c -- compute the CRC-32 of a data stream
  10.  * Copyright (C) 1995-1998 Mark Adler
  11.  * For conditions of distribution and use, see copyright notice in zlib.h 
  12.  */
  13. typedef unsigned __int32 CRC_UINT32;
  14. typedef unsigned __int8  CRC_BYTE;
  15. #ifdef DYNAMIC_CRC_TABLE
  16. static int CRCTableEmptyFlag = 1;
  17. static CRC_UINT32 CRC_Table[256];
  18. static void MakeCRCTable(void);
  19. /*
  20.   Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
  21.   x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
  22.   Polynomials over GF(2) are represented in binary, one bit per coefficient,
  23.   with the lowest powers in the most significant bit.  Then adding polynomials
  24.   is just exclusive-or, and multiplying a polynomial by x is a right shift by
  25.   one.  If we call the above polynomial p, and represent a byte as the
  26.   polynomial q, also with the lowest power in the most significant bit (so the
  27.   byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
  28.   where a mod b means the remainder after dividing a by b.
  29.   This calculation is done using the shift-register method of multiplying and
  30.   taking the remainder.  The register is initialized to zero, and for each
  31.   incoming bit, x^32 is added mod p to the register if the bit is a one (where
  32.   x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
  33.   x (which is shifting right by one and adding x^32 mod p if the bit shifted
  34.   out is a one).  We start with the highest power (least significant bit) of
  35.   q and repeat for all eight bits of q.
  36.   The table is simply the CRC of all possible eight bit values.  This is all
  37.   the information needed to generate CRC's on data a byte at a time for all
  38.   combinations of CRC register values and incoming bytes.
  39. */
  40. static void MakeCRCTable()
  41. {
  42.   CRC_UINT32 CRC;
  43.   CRC_UINT32 n, k;
  44.   CRC_UINT32 poly;            /* polynomial exclusive-or pattern */
  45.   /* terms of polynomial defining this crc (except x^32): */
  46.   static const CRC_BYTE p[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26};
  47.   /* make exclusive-or pattern from polynomial (0xedb88320L) */
  48.   poly = 0L;
  49.   for (n = 0; n < sizeof(p) / sizeof(CRC_BYTE); n++)
  50.     poly |= 1L << (31 - p[n]);
  51.  
  52.   for (n = 0; n < 256; n++)
  53.   {
  54.     CRC = n;
  55.     for (k = 0; k < 8; k++)
  56.     {
  57.         if (CRC & 1)
  58.             CRC = poly ^ (CRC >> 1);
  59.         else
  60.             CRC = CRC >> 1;
  61.     }
  62.     CRC_Table[n] = CRC;
  63.   }
  64.   CRCTableEmptyFlag = 0;
  65. }
  66. #else
  67. // ========================================================================
  68. // Table of CRC-32's of all single-byte values (made by make_crc_table)
  69. //
  70. static const CRC_UINT32 CRC_Table[256] = {
  71.   0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
  72.   0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
  73.   0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
  74.   0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
  75.   0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
  76.   0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
  77.   0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
  78.   0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
  79.   0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
  80.   0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
  81.   0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
  82.   0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
  83.   0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
  84.   0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
  85.   0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
  86.   0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
  87.   0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
  88.   0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
  89.   0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
  90.   0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
  91.   0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
  92.   0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
  93.   0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
  94.   0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
  95.   0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
  96.   0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
  97.   0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
  98.   0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
  99.   0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
  100.   0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
  101.   0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
  102.   0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
  103.   0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
  104.   0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
  105.   0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
  106.   0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
  107.   0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
  108.   0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
  109.   0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
  110.   0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
  111.   0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
  112.   0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
  113.   0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
  114.   0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
  115.   0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
  116.   0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
  117.   0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
  118.   0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
  119.   0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
  120.   0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
  121.   0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
  122.   0x2d02ef8dL
  123. };
  124. #endif  // DYNAMIC_CRC_TABLE
  125. // =========================================================================
  126. // This function can be used by asm versions of crc32()
  127. //
  128. const CRC_UINT32 * GetCRCTable()
  129. {
  130. #ifdef DYNAMIC_CRC_TABLE
  131.   if (CRCTableEmptyFlag) 
  132.       MakeCRCTable();
  133. #endif
  134.   return (const CRC_UINT32 *)CRC_Table;
  135. }
  136. // Use internal CRC32 function
  137. // =========================================================================
  138. #define DO1BYTE(pBuf) CRC = CRC_Table[(CRC ^ (*pBuf++)) & 0xff] ^ (CRC >> 8);
  139. //#define DO2(pBuf)  DO1(pBuf); DO1(pBuf);
  140. //#define DO4(pBuf)  DO2(pBuf); DO2(pBuf);
  141. //#define DO8(pBuf)  DO4(pBuf); DO4(pBuf);
  142. // =========================================================================
  143. unsigned CRC32_C(unsigned CRC, const void *pvBuf, int nLen)
  144. //unsigned CRC32(unsigned CRC, const void *pvBuf, int nLen)
  145. {
  146.     const CRC_BYTE *pBuf = pvBuf;
  147.     if (pvBuf == (void *)0)
  148.         return 0L;
  149.     #ifdef DYNAMIC_CRC_TABLE
  150.     if (CRCTableEmptyFlag)
  151.         MakeCRCTable();
  152.     #endif  // DYNAMIC_CRC_TABLE
  153.     CRC = CRC ^ 0xffffffffL;    // equal CRC = ~CRC
  154.     while (nLen >= 8)
  155.     {
  156.         // It's easy to debug
  157.         DO1BYTE(pBuf);          // 0
  158.         DO1BYTE(pBuf);          // 1
  159.         DO1BYTE(pBuf);          // 2
  160.         DO1BYTE(pBuf);          // 3
  161.         DO1BYTE(pBuf);          // 4
  162.         DO1BYTE(pBuf);          // 5
  163.         DO1BYTE(pBuf);          // 6
  164.         DO1BYTE(pBuf);          // 7
  165.         nLen -= 8;
  166.     }
  167.     if (nLen)
  168.     {
  169.         do {
  170.             DO1BYTE(pBuf);
  171.         } while (--nLen);
  172.     }
  173.     return (CRC ^ 0xffffffffL);   // equal return ~CRC
  174. }
  175. // ============================================================================
  176. //
  177. // ASM Part in Visual C++
  178. //
  179. // ============================================================================
  180. //#define DO1BYTE(pBuf) CRC = CRC_Table[(CRC ^ (*pBuf++)) & 0xff] ^ (CRC >> 8);
  181. #define DO1BYTEASM() 
  182.     __asm{ mov bl, [esi] } 
  183.     __asm{ inc esi } 
  184.     __asm{ xor ebx, eax } 
  185.     __asm{ shr eax, 8 } 
  186.     __asm{ and ebx, 0xff } 
  187.     __asm{ xor eax, CRC_Table[ebx * 4] }
  188. //unsigned CRC32_ASM(unsigned CRC, const void *pvBuf, int nLen)
  189. unsigned CRC32(unsigned CRC, const void *pvBuf, int nLen)
  190. {
  191.     unsigned RetCode = 0;
  192.     if (!pvBuf)
  193.         return RetCode;
  194.     __asm mov esi, [pvBuf]
  195.     __asm mov ecx, [nLen]
  196.     __asm mov eax, [CRC]
  197.     __asm shr ecx, 3
  198.     __asm xor eax, 0xffffffff
  199.     __asm test ecx, ecx
  200.     __asm jz CRC_Last7Bytes
  201.     
  202.     __asm push ebp
  203.     __asm mov ebp, ecx
  204.     __asm xor edx, edx
  205.     __asm xor ecx, ecx
  206.     __asm align 4
  207. CRC_Loop1:
  208.     // eax = CRC
  209.     // edx first TableIndex
  210.     // ecx second TableIndex
  211.     // Process 4 bytes
  212.     __asm mov ebx, [esi]
  213.     __asm add esi, 4
  214.     
  215.     __asm mov dl, bl
  216.     __asm mov cl, bh
  217.     __asm xor dl, al
  218.     __asm shr eax, 8
  219.     __asm mov edi, CRC_Table[edx * 4]
  220.     __asm shr ebx, 16
  221.     __asm xor eax, edi
  222.     __asm xor cl, al
  223.     __asm shr eax, 8
  224.     __asm mov edi, CRC_Table[ecx * 4]
  225.     __asm mov dl, bl
  226.     __asm xor eax, edi
  227.     __asm xor dl, al
  228.     __asm shr eax, 8
  229.     __asm mov edi, CRC_Table[edx * 4] 
  230.     __asm mov cl, bh
  231.     __asm xor eax, edi
  232.     __asm mov ebx, [esi]
  233.     __asm xor cl, al
  234.     __asm shr eax, 8
  235.     __asm mov edi, CRC_Table[ecx * 4]
  236.     __asm add esi, 4
  237.     __asm xor eax, edi
  238.     
  239.     __asm mov dl, bl
  240.     __asm mov cl, bh
  241.     __asm xor dl, al
  242.     __asm shr eax, 8
  243.     __asm mov edi, CRC_Table[edx * 4]
  244.     __asm shr ebx, 16
  245.     __asm xor eax, edi
  246.     __asm xor cl, al
  247.     __asm shr eax, 8
  248.     __asm mov edi, CRC_Table[ecx * 4]
  249.     __asm mov dl, bl
  250.     __asm xor eax, edi
  251.     __asm xor dl, al
  252.     __asm shr eax, 8
  253.     __asm mov edi, CRC_Table[edx * 4] 
  254.     __asm mov cl, bh
  255.     __asm xor eax, edi
  256.     __asm xor cl, al
  257.     __asm shr eax, 8
  258.     __asm xor eax, CRC_Table[ecx * 4]
  259.     __asm dec ebp
  260.     __asm jnz CRC_Loop1
  261.     __asm pop ebp
  262. CRC_Last7Bytes:
  263.     __asm mov ecx, [nLen]
  264.     __asm xor edx, edx
  265.     __asm and ecx, 0x7
  266.     __asm jz CRC_Exit
  267. CRC_Loop2:
  268.     __asm mov dl, [esi]
  269.     __asm inc esi
  270.     __asm xor dl, al
  271.     __asm shr eax, 8
  272.     __asm xor eax, CRC_Table[edx * 4]
  273.     __asm dec ecx
  274.     __asm jnz CRC_Loop2
  275. CRC_Exit:
  276.     __asm xor eax, 0xffffffff
  277.     __asm mov [RetCode], eax
  278.     return RetCode;
  279. }
  280. /*
  281. unsigned CRC32(unsigned CRC, const void *pvBuf, int nLen)
  282. {
  283.     unsigned RetCode = 0;
  284.     if (!pvBuf)
  285.         return RetCode;
  286.     __asm mov esi, [pvBuf]
  287.     __asm mov ecx, [nLen]
  288.     __asm mov eax, [CRC]
  289.     __asm shr ecx, 3
  290.     __asm xor eax, 0xffffffff
  291.     __asm test ecx, ecx
  292.     __asm jz CRC_Last7Bytes
  293. CRC_Loop1:
  294.     __asm xor edx, edx
  295.     // Process 4 bytes
  296.     __asm mov ebx, [esi]
  297.     __asm add esi, 4
  298.     
  299.     __asm mov dl, bl
  300.     __asm shr ebx, 8
  301.     __asm xor dl, al
  302.     __asm shr eax, 8
  303.     __asm mov edi, CRC_Table[edx * 4]
  304.     
  305.     __asm mov dl, bl
  306.     __asm xor eax, edi
  307.     
  308.     __asm shr ebx, 8
  309.     __asm xor dl, al
  310.     __asm shr eax, 8
  311.     __asm mov edi, CRC_Table[edx * 4]
  312.     __asm mov dl, bl
  313.     __asm xor eax, edi
  314.     
  315.     __asm shr ebx, 8
  316.     __asm xor dl, al
  317.     __asm shr eax, 8
  318.     __asm mov edi, CRC_Table[edx * 4]
  319.     __asm mov dl, bl
  320.     __asm xor eax, edi
  321.     
  322.     __asm xor dl, al
  323.     __asm shr eax, 8
  324.     __asm xor eax, CRC_Table[edx * 4]
  325.     
  326.     // Process 4 bytes
  327.     __asm mov ebx, [esi]
  328.     __asm add esi, 4
  329.     
  330.     __asm mov dl, bl
  331.     __asm shr ebx, 8
  332.     __asm xor dl, al
  333.     __asm shr eax, 8
  334.     __asm mov edi, CRC_Table[edx * 4]
  335.     
  336.     __asm mov dl, bl
  337.     __asm xor eax, edi
  338.     
  339.     __asm shr ebx, 8
  340.     __asm xor dl, al
  341.     __asm shr eax, 8
  342.     __asm mov edi, CRC_Table[edx * 4]
  343.     __asm mov dl, bl
  344.     __asm xor eax, edi
  345.     
  346.     __asm shr ebx, 8
  347.     __asm xor dl, al
  348.     __asm shr eax, 8
  349.     __asm mov edi, CRC_Table[edx * 4]
  350.     __asm mov dl, bl
  351.     __asm xor eax, edi
  352.     
  353.     __asm xor dl, al
  354.     __asm shr eax, 8
  355.     __asm xor eax, CRC_Table[edx * 4]
  356.     __asm dec ecx
  357.     __asm jnz CRC_Loop1
  358. CRC_Last7Bytes:
  359.     __asm mov ecx, [nLen]
  360.     __asm xor edx, edx
  361.     
  362.     __asm test ecx, 0x4
  363.     __asm jz CRC_Last3Bytes
  364.     // Process 4 bytes
  365.     __asm mov ebx, [esi]
  366.     __asm add esi, 4
  367.     
  368.     __asm mov dl, bl
  369.     __asm shr ebx, 8
  370.     __asm xor dl, al
  371.     __asm shr eax, 8
  372.     __asm mov edi, CRC_Table[edx * 4]
  373.     
  374.     __asm mov dl, bl
  375.     __asm xor eax, edi
  376.     
  377.     __asm shr ebx, 8
  378.     __asm xor dl, al
  379.     __asm shr eax, 8
  380.     __asm mov edi, CRC_Table[edx * 4]
  381.     __asm mov dl, bl
  382.     __asm xor eax, edi
  383.     
  384.     __asm shr ebx, 8
  385.     __asm xor dl, al
  386.     __asm shr eax, 8
  387.     __asm mov edi, CRC_Table[edx * 4]
  388.     __asm mov dl, bl
  389.     __asm xor eax, edi
  390.     
  391.     __asm xor dl, al
  392.     __asm shr eax, 8
  393.     __asm xor eax, CRC_Table[edx * 4]
  394.     
  395. CRC_Last3Bytes:
  396.     __asm xor edx, edx
  397.     __asm and ecx, 0x3
  398.     __asm jz CRC_Exit
  399. CRC_Loop2:
  400.     __asm mov dl, [esi]
  401.     __asm inc esi
  402.     __asm xor dl, al
  403.     __asm shr eax, 8
  404.     __asm xor eax, CRC_Table[edx * 4]
  405.     __asm dec ecx
  406.     __asm jnz CRC_Loop2
  407. CRC_Exit:
  408.     __asm xor eax, 0xffffffff
  409.     __asm mov [RetCode], eax
  410.     return RetCode;
  411. }
  412. */