Home | History | Annotate | Download | only in Common
      1 // Common/CRC.cs
      2 
      3 namespace SevenZip
      4 {
      5 	class CRC
      6 	{
      7 		public static readonly uint[] Table;
      8 
      9 		static CRC()
     10 		{
     11 			Table = new uint[256];
     12 			const uint kPoly = 0xEDB88320;
     13 			for (uint i = 0; i < 256; i++)
     14 			{
     15 				uint r = i;
     16 				for (int j = 0; j < 8; j++)
     17 					if ((r & 1) != 0)
     18 						r = (r >> 1) ^ kPoly;
     19 					else
     20 						r >>= 1;
     21 				Table[i] = r;
     22 			}
     23 		}
     24 
     25 		uint _value = 0xFFFFFFFF;
     26 
     27 		public void Init() { _value = 0xFFFFFFFF; }
     28 
     29 		public void UpdateByte(byte b)
     30 		{
     31 			_value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8);
     32 		}
     33 
     34 		public void Update(byte[] data, uint offset, uint size)
     35 		{
     36 			for (uint i = 0; i < size; i++)
     37 				_value = Table[(((byte)(_value)) ^ data[offset + i])] ^ (_value >> 8);
     38 		}
     39 
     40 		public uint GetDigest() { return _value ^ 0xFFFFFFFF; }
     41 
     42 		static uint CalculateDigest(byte[] data, uint offset, uint size)
     43 		{
     44 			CRC crc = new CRC();
     45 			// crc.Init();
     46 			crc.Update(data, offset, size);
     47 			return crc.GetDigest();
     48 		}
     49 
     50 		static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size)
     51 		{
     52 			return (CalculateDigest(data, offset, size) == digest);
     53 		}
     54 	}
     55 }
     56