Upload 2.0.2
[physicsfs] / lzma / CS / 7zip / Common / CRC.cs
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 }