<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.0" />

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; } } } }