1// Common/CRC.cs
2
3namespace 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