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