misc/libphysfs/lzma/CS/7zip/Common/CRC.cs
branchui-scaling
changeset 15283 c4fd2813b127
parent 13390 0135e64c6c66
parent 15279 7ab5cf405686
child 15663 d92eeb468dad
equal deleted inserted replaced
13390:0135e64c6c66 15283:c4fd2813b127
     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 }