1 // HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
\r
2 namespace HtmlAgilityPack
\r
5 /// A utility class to compute CRC32.
\r
11 private uint _crc32;
\r
15 #region Static Members
\r
17 private static uint[] crc_32_tab = // CRC polynomial 0xedb88320
\r
19 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
\r
20 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
\r
21 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
\r
22 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
\r
23 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
\r
24 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
\r
25 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
\r
26 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
\r
27 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
\r
28 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
\r
29 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
\r
30 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
\r
31 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
\r
32 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
\r
33 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
\r
34 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
\r
35 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
\r
36 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
\r
37 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
\r
38 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
\r
39 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
\r
40 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
\r
41 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
\r
42 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
\r
43 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
\r
44 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
\r
45 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
\r
46 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
\r
47 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
\r
48 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
\r
49 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
\r
50 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
\r
51 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
\r
52 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
\r
53 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
\r
54 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
\r
55 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
\r
56 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
\r
57 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
\r
58 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
\r
59 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
\r
60 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
\r
61 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
\r
68 internal uint CheckSum
\r
70 get { return _crc32; }
\r
71 set { _crc32 = value; }
\r
76 #region Public Methods
\r
79 /// Compute a checksum for a given array of bytes.
\r
81 /// <param name="bytes">The array of bytes to compute the checksum for.</param>
\r
82 /// <returns>The computed checksum.</returns>
\r
83 public static uint CRC32Bytes(byte[] bytes)
\r
86 oldcrc32 = 0xFFFFFFFF;
\r
87 int len = bytes.Length;
\r
89 for (int i = 0; len > 0; i++)
\r
92 oldcrc32 = UPDC32(bytes[len], oldcrc32);
\r
98 /// Compute a checksum for a given string.
\r
100 /// <param name="text">The string to compute the checksum for.</param>
\r
101 /// <returns>The computed checksum.</returns>
\r
102 public static uint CRC32String(string text)
\r
105 oldcrc32 = 0xFFFFFFFF;
\r
106 int len = text.Length;
\r
108 byte lowByte, hiByte;
\r
110 for (int i = 0; len > 0; i++)
\r
113 uCharVal = text[len];
\r
116 lowByte = (byte) (uCharVal & 0x00ff);
\r
117 hiByte = (byte) (uCharVal >> 8);
\r
119 oldcrc32 = UPDC32(hiByte, oldcrc32);
\r
120 oldcrc32 = UPDC32(lowByte, oldcrc32);
\r
128 #region Internal Methods
\r
130 internal uint AddToCRC32(int c)
\r
132 return AddToCRC32((ushort) c);
\r
135 internal uint AddToCRC32(ushort c)
\r
137 byte lowByte, hiByte;
\r
138 lowByte = (byte) (c & 0x00ff);
\r
139 hiByte = (byte) (c >> 8);
\r
140 _crc32 = UPDC32(hiByte, _crc32);
\r
141 _crc32 = UPDC32(lowByte, _crc32);
\r
147 #region Private Methods
\r
149 private static uint UPDC32(byte octet, uint crc)
\r
151 return (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8));
\r