CRC
class CRC
namespace Org.BouncyCastle.Utilities.Bzip2
{
internal class CRC
{
private static readonly uint[] Crc32Table = new uint[256] {
0,
3072180484,
1849393673,
3643163405,
3698721811,
1802224919,
2991425050,
89147166,
3102541862,
267438370,
3604384303,
1640713003,
1687882805,
3548826929,
178294332,
3183300408,
1893405004,
3351695432,
518034245,
2851951169,
2897024351,
464573531,
3264649046,
1972065874,
3358988650,
2133579886,
2785909603,
286284391,
339746169,
2740837501,
2054922096,
3446038132,
3770033048,
1470882460,
2391646609,
965763221,
1019225995,
2346575503,
1392223618,
3857081478,
1482369982,
4014402234,
912304567,
2172479667,
2217553837,
858844841,
3927354788,
1561029792,
2423075540,
661713872,
4267094237,
1229681113,
1276851911,
4211537859,
572568782,
2503833034,
679492338,
2677930998,
1186707707,
4054219263,
4109778657,
1139539941,
2597174504,
768638444,
2003863092,
3228387120,
424346685,
2924922169,
2869330471,
471548707,
3309109294,
1914749226,
3483209234,
2021674774,
2712013851,
381406495,
334203393,
2767604485,
2110785544,
3402483980,
128685944,
2964739708,
1771050353,
3733836917,
3688731499,
1824543343,
3051753826,
50057318,
3209076574,
140205658,
3514637655,
1717623891,
1664129869,
3559742025,
218831172,
3122059328,
2546378156,
551249064,
4194117541,
1323361953,
1269866943,
4239220923,
629875638,
2459361970,
791391626,
2553703566,
1091579779,
4128108167,
4083001753,
1145071773,
2640718736,
712764052,
3877483744,
1342207460,
2300983017,
1044117485,
996913395,
2356572663,
1431319290,
3796759550,
1609612486,
3907878338,
835403471,
2262237131,
2206644437,
882604497,
3988601564,
1520499672,
4007660649,
1509805421,
2161872480,
935743332,
848693370,
2240530814,
1554877043,
3954199415,
1443693647,
3775972683,
943097414,
2401978178,
2323316828,
1030144344,
3829432917,
1398621009,
2654674213,
690412577,
4026572588,
1193106984,
1112348982,
4115716146,
745970495,
2607503931,
651564291,
2446054407,
1223530250,
4293940750,
4204794128,
1304285204,
2493223705,
596005405,
240529393,
3108761333,
1617800696,
3614469372,
3525323746,
1698556646,
3155929579,
184969455,
3065718743,
27715283,
3632309726,
1872585946,
1791828932,
3721454272,
83272141,
3018547401,
2123185853,
3381723065,
280411316,
2813033904,
2734373550,
367459242,
3435182247,
2078112163,
3328194203,
1904080799,
2824582290,
524711318,
437662344,
2903241612,
1949151361,
3274731909,
2576386653,
781011801,
4155181140,
1085720912,
1172737614,
4076556106,
735906887,
2629881155,
561873531,
2522891135,
1329987698,
4166762870,
4245390952,
1242974060,
2469397601,
606979429,
3914046225,
1582717461,
2272270616,
812505116,
893230850,
2183159302,
1527127307,
3961248783,
1369871159,
3871035955,
1067258174,
2290143290,
2379257636,
986535456,
3823834413,
1425462313,
2032576965,
3459999937,
387787724,
2684414664,
2773528022,
307064018,
3412799455,
2088169179,
3251347939,
1993760999,
2951750634,
418243310,
498968048,
2862638324,
1938171897,
3298551549,
167622793,
3202382221,
1741044352,
3504077700,
3582704794,
1654029726,
3148889747,
212729751,
2970661039,
101544363,
3744150182,
1748431778,
1835447484,
3665524152,
56440501,
3024156593
};
private uint m_value;
internal void Initialise()
{
m_value = uint.MaxValue;
}
internal int GetFinal()
{
return (int)(~Integers.ReverseBytes(m_value));
}
internal void Update(byte inCh)
{
m_value = ((m_value >> 8) ^ Crc32Table[(byte)(m_value ^ inCh)]);
}
internal void UpdateRun(byte inCh, int runLength)
{
uint num = (uint)((inCh << 8) | inCh);
uint num2 = (num << 16) | num;
do {
m_value ^= num2;
m_value = ((m_value >> 8) ^ Crc32Table[(byte)m_value]);
m_value = ((m_value >> 8) ^ Crc32Table[(byte)m_value]);
m_value = ((m_value >> 8) ^ Crc32Table[(byte)m_value]);
m_value = ((m_value >> 8) ^ Crc32Table[(byte)m_value]);
} while ((runLength -= 4) >= 4);
switch (runLength & 3) {
case 0:
break;
case 1:
Update(inCh);
break;
case 2:
Update(inCh);
Update(inCh);
break;
case 3:
Update(inCh);
Update(inCh);
Update(inCh);
break;
}
}
}
}