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