equal
deleted
inserted
replaced
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 } |
|