• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Common/CRC.cs
2 
3 namespace SevenZip
4 {
5 	class CRC
6 	{
7 		public static readonly uint[] Table;
8 
CRC()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 
Init()27 		public void Init() { _value = 0xFFFFFFFF; }
28 
UpdateByte(byte b)29 		public void UpdateByte(byte b)
30 		{
31 			_value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8);
32 		}
33 
Update(byte[] data, uint offset, uint size)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 
GetDigest()40 		public uint GetDigest() { return _value ^ 0xFFFFFFFF; }
41 
CalculateDigest(byte[] data, uint offset, uint size)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 
VerifyDigest(uint digest, byte[] data, uint offset, uint size)50 		static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size)
51 		{
52 			return (CalculateDigest(data, offset, size) == digest);
53 		}
54 	}
55 }
56