Crc32.cs
上传用户:huiyue
上传日期:2022-04-08
资源大小:1429k
文件大小:4k
源码类别:

搜索引擎

开发平台:

ASP/ASPX

  1. // Crc32.cs
  2. //
  3. // Copyright (c) 2006, 2007 Microsoft Corporation.  All rights reserved.
  4. //
  5. //
  6. // Implements the CRC algorithm, which is used in zip files.  The zip format calls for
  7. // the zipfile to contain a CRC for the unencrypted byte stream of each file.
  8. //
  9. // It is based on example source code published at
  10. //    http://www.vbaccelerator.com/home/net/code/libraries/CRC32/Crc32_zip_CRC32_CRC32_cs.asp
  11. //
  12. // This implementation adds a tweak of that code for use within zip creation.  While
  13. // computing the CRC we also compress the byte stream, in the same read loop. This
  14. // avoids the need to read through the uncompressed stream twice - once to computer CRC
  15. // and another time to compress.
  16. //
  17. //
  18. // Thu, 30 Mar 2006  13:58
  19. // 
  20. using System;
  21. namespace ionic.utils.zip
  22. {
  23.    /// <summary>
  24.    /// Calculates a 32bit Cyclic Redundancy Checksum (CRC) using the
  25.    /// same polynomial used by Zip.
  26.    /// </summary>
  27.    public class CRC32
  28.    {      
  29.       private UInt32[] crc32Table;
  30.       private const int BUFFER_SIZE = 8192;
  31.      
  32.      private Int32 _TotalBytesRead= 0; 
  33.      public Int32 TotalBytesRead {
  34.        get {
  35.  return _TotalBytesRead;
  36.        }
  37.      }
  38.       /// <summary>
  39.       /// Returns the CRC32 for the specified stream.
  40.       /// </summary>
  41.       /// <param name="input">The stream over which to calculate the CRC32</param>
  42.       /// <returns>the CRC32 calculation</returns>
  43.       [CLSCompliant(false)]
  44.        public UInt32 GetCrc32(System.IO.Stream input)
  45.       {
  46.      return GetCrc32AndCopy(input, null) ;
  47.       }
  48.       /// <summary>
  49.       /// Returns the CRC32 for the specified stream, and writes the input into the output stream.
  50.       /// </summary>
  51.       /// <param name="input">The stream over which to calculate the CRC32</param>
  52.       /// <param name="output">The stream into which to deflate the input</param>
  53.       /// <returns>the CRC32 calculation</returns>
  54.        [CLSCompliant(false)]
  55.        public UInt32 GetCrc32AndCopy(System.IO.Stream input, System.IO.Stream output)
  56.       {
  57.          unchecked
  58.          {
  59.             UInt32 crc32Result;
  60.             crc32Result = 0xFFFFFFFF;
  61.             byte[] buffer = new byte[BUFFER_SIZE];
  62.             int readSize = BUFFER_SIZE;
  63.     _TotalBytesRead= 0;
  64.             int count = input.Read(buffer, 0, readSize);
  65.     if (output != null) output.Write(buffer,0,count); 
  66.     _TotalBytesRead += count;
  67.             while (count > 0)
  68.             {
  69.                for (int i = 0; i < count; i++)
  70.                {
  71.                   crc32Result = ((crc32Result) >> 8) ^ crc32Table[(buffer[i]) ^ ((crc32Result) & 0x000000FF)];
  72.                }
  73.                count = input.Read(buffer, 0, readSize);
  74.        if (output != null) output.Write(buffer,0,count); 
  75.        _TotalBytesRead += count;
  76.             }
  77.             
  78.             return ~crc32Result;
  79.          }
  80.       }
  81.       /// <summary>
  82.       /// Construct an instance of the CRC32 class, pre-initialising the table
  83.       /// for speed of lookup.
  84.       /// </summary>
  85.       public CRC32()
  86.       {
  87.          unchecked
  88.          {
  89.             // This is the official polynomial used by CRC32 in PKZip.
  90.             // Often the polynomial is shown reversed as 0x04C11DB7.
  91.             UInt32 dwPolynomial = 0xEDB88320;
  92.             UInt32 i, j;
  93.             crc32Table = new UInt32[256];
  94.             UInt32 dwCrc;
  95.             for(i = 0; i < 256; i++)
  96.             {
  97.                dwCrc = i;
  98.                for(j = 8; j > 0; j--)
  99.                {
  100.                   if ((dwCrc & 1)==1)
  101.                   {
  102.                      dwCrc = (dwCrc >> 1) ^ dwPolynomial;
  103.                   }
  104.                   else
  105.                   {
  106.                      dwCrc >>= 1;
  107.                   }
  108.                }
  109.                crc32Table[i] = dwCrc;
  110.             }
  111.          }
  112.       }
  113.    }
  114. }