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