001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017/*
018 * Some portions of this file Copyright (c) 2004-2006 Intel Corporation
019 * and licensed under the BSD license.
020 */
021package org.apache.commons.codec.digest;
022
023import java.util.zip.Checksum;
024
025/**
026 * A pure-Java implementation of the CRC32 checksum that uses the CRC32-C polynomial, the same polynomial used by iSCSI and implemented on many Intel chipsets
027 * supporting SSE 4.2.
028 *
029 * <p>
030 * Copied from Apache Hadoop 2.3.6: https://gitbox.apache.org/repos/asf?p=hadoop.git;a=blob_plain;
031 * f=hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/PureJavaCrc32C.java; hb=2120de588b92b9f22b1cc4188761d6a8c61aa778
032 * </p>
033 * <p>
034 * This class is Not ThreadSafe
035 * </p>
036 *
037 * @since 1.11
038 */
039public class PureJavaCrc32C implements Checksum {
040
041    // CRC polynomial tables generated by:
042    // java -cp build/test/classes/:build/classes/ \
043    // org.apache.hadoop.util.TestPureJavaCrc32\$Table 82F63B78
044
045    private static final int T8_0_START = 0 * 256;
046    private static final int T8_1_START = 1 * 256;
047    private static final int T8_2_START = 2 * 256;
048    private static final int T8_3_START = 3 * 256;
049    private static final int T8_4_START = 4 * 256;
050    private static final int T8_5_START = 5 * 256;
051    private static final int T8_6_START = 6 * 256;
052    private static final int T8_7_START = 7 * 256;
053
054    // @formatter:off
055    private static final int[] T = {
056      /* T8_0 */
057      0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
058      0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
059      0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
060      0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
061      0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
062      0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
063      0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
064      0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
065      0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
066      0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
067      0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
068      0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
069      0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
070      0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
071      0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
072      0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
073      0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
074      0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
075      0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
076      0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
077      0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
078      0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
079      0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
080      0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
081      0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
082      0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
083      0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
084      0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
085      0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
086      0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
087      0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
088      0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
089      0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
090      0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
091      0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
092      0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
093      0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
094      0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
095      0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
096      0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
097      0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
098      0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
099      0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
100      0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
101      0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
102      0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
103      0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
104      0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
105      0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
106      0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
107      0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
108      0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
109      0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
110      0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
111      0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
112      0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
113      0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
114      0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
115      0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
116      0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
117      0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
118      0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
119      0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
120      0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351,
121      /* T8_1 */
122      0x00000000, 0x13A29877, 0x274530EE, 0x34E7A899,
123      0x4E8A61DC, 0x5D28F9AB, 0x69CF5132, 0x7A6DC945,
124      0x9D14C3B8, 0x8EB65BCF, 0xBA51F356, 0xA9F36B21,
125      0xD39EA264, 0xC03C3A13, 0xF4DB928A, 0xE7790AFD,
126      0x3FC5F181, 0x2C6769F6, 0x1880C16F, 0x0B225918,
127      0x714F905D, 0x62ED082A, 0x560AA0B3, 0x45A838C4,
128      0xA2D13239, 0xB173AA4E, 0x859402D7, 0x96369AA0,
129      0xEC5B53E5, 0xFFF9CB92, 0xCB1E630B, 0xD8BCFB7C,
130      0x7F8BE302, 0x6C297B75, 0x58CED3EC, 0x4B6C4B9B,
131      0x310182DE, 0x22A31AA9, 0x1644B230, 0x05E62A47,
132      0xE29F20BA, 0xF13DB8CD, 0xC5DA1054, 0xD6788823,
133      0xAC154166, 0xBFB7D911, 0x8B507188, 0x98F2E9FF,
134      0x404E1283, 0x53EC8AF4, 0x670B226D, 0x74A9BA1A,
135      0x0EC4735F, 0x1D66EB28, 0x298143B1, 0x3A23DBC6,
136      0xDD5AD13B, 0xCEF8494C, 0xFA1FE1D5, 0xE9BD79A2,
137      0x93D0B0E7, 0x80722890, 0xB4958009, 0xA737187E,
138      0xFF17C604, 0xECB55E73, 0xD852F6EA, 0xCBF06E9D,
139      0xB19DA7D8, 0xA23F3FAF, 0x96D89736, 0x857A0F41,
140      0x620305BC, 0x71A19DCB, 0x45463552, 0x56E4AD25,
141      0x2C896460, 0x3F2BFC17, 0x0BCC548E, 0x186ECCF9,
142      0xC0D23785, 0xD370AFF2, 0xE797076B, 0xF4359F1C,
143      0x8E585659, 0x9DFACE2E, 0xA91D66B7, 0xBABFFEC0,
144      0x5DC6F43D, 0x4E646C4A, 0x7A83C4D3, 0x69215CA4,
145      0x134C95E1, 0x00EE0D96, 0x3409A50F, 0x27AB3D78,
146      0x809C2506, 0x933EBD71, 0xA7D915E8, 0xB47B8D9F,
147      0xCE1644DA, 0xDDB4DCAD, 0xE9537434, 0xFAF1EC43,
148      0x1D88E6BE, 0x0E2A7EC9, 0x3ACDD650, 0x296F4E27,
149      0x53028762, 0x40A01F15, 0x7447B78C, 0x67E52FFB,
150      0xBF59D487, 0xACFB4CF0, 0x981CE469, 0x8BBE7C1E,
151      0xF1D3B55B, 0xE2712D2C, 0xD69685B5, 0xC5341DC2,
152      0x224D173F, 0x31EF8F48, 0x050827D1, 0x16AABFA6,
153      0x6CC776E3, 0x7F65EE94, 0x4B82460D, 0x5820DE7A,
154      0xFBC3FAF9, 0xE861628E, 0xDC86CA17, 0xCF245260,
155      0xB5499B25, 0xA6EB0352, 0x920CABCB, 0x81AE33BC,
156      0x66D73941, 0x7575A136, 0x419209AF, 0x523091D8,
157      0x285D589D, 0x3BFFC0EA, 0x0F186873, 0x1CBAF004,
158      0xC4060B78, 0xD7A4930F, 0xE3433B96, 0xF0E1A3E1,
159      0x8A8C6AA4, 0x992EF2D3, 0xADC95A4A, 0xBE6BC23D,
160      0x5912C8C0, 0x4AB050B7, 0x7E57F82E, 0x6DF56059,
161      0x1798A91C, 0x043A316B, 0x30DD99F2, 0x237F0185,
162      0x844819FB, 0x97EA818C, 0xA30D2915, 0xB0AFB162,
163      0xCAC27827, 0xD960E050, 0xED8748C9, 0xFE25D0BE,
164      0x195CDA43, 0x0AFE4234, 0x3E19EAAD, 0x2DBB72DA,
165      0x57D6BB9F, 0x447423E8, 0x70938B71, 0x63311306,
166      0xBB8DE87A, 0xA82F700D, 0x9CC8D894, 0x8F6A40E3,
167      0xF50789A6, 0xE6A511D1, 0xD242B948, 0xC1E0213F,
168      0x26992BC2, 0x353BB3B5, 0x01DC1B2C, 0x127E835B,
169      0x68134A1E, 0x7BB1D269, 0x4F567AF0, 0x5CF4E287,
170      0x04D43CFD, 0x1776A48A, 0x23910C13, 0x30339464,
171      0x4A5E5D21, 0x59FCC556, 0x6D1B6DCF, 0x7EB9F5B8,
172      0x99C0FF45, 0x8A626732, 0xBE85CFAB, 0xAD2757DC,
173      0xD74A9E99, 0xC4E806EE, 0xF00FAE77, 0xE3AD3600,
174      0x3B11CD7C, 0x28B3550B, 0x1C54FD92, 0x0FF665E5,
175      0x759BACA0, 0x663934D7, 0x52DE9C4E, 0x417C0439,
176      0xA6050EC4, 0xB5A796B3, 0x81403E2A, 0x92E2A65D,
177      0xE88F6F18, 0xFB2DF76F, 0xCFCA5FF6, 0xDC68C781,
178      0x7B5FDFFF, 0x68FD4788, 0x5C1AEF11, 0x4FB87766,
179      0x35D5BE23, 0x26772654, 0x12908ECD, 0x013216BA,
180      0xE64B1C47, 0xF5E98430, 0xC10E2CA9, 0xD2ACB4DE,
181      0xA8C17D9B, 0xBB63E5EC, 0x8F844D75, 0x9C26D502,
182      0x449A2E7E, 0x5738B609, 0x63DF1E90, 0x707D86E7,
183      0x0A104FA2, 0x19B2D7D5, 0x2D557F4C, 0x3EF7E73B,
184      0xD98EEDC6, 0xCA2C75B1, 0xFECBDD28, 0xED69455F,
185      0x97048C1A, 0x84A6146D, 0xB041BCF4, 0xA3E32483,
186      /* T8_2 */
187      0x00000000, 0xA541927E, 0x4F6F520D, 0xEA2EC073,
188      0x9EDEA41A, 0x3B9F3664, 0xD1B1F617, 0x74F06469,
189      0x38513EC5, 0x9D10ACBB, 0x773E6CC8, 0xD27FFEB6,
190      0xA68F9ADF, 0x03CE08A1, 0xE9E0C8D2, 0x4CA15AAC,
191      0x70A27D8A, 0xD5E3EFF4, 0x3FCD2F87, 0x9A8CBDF9,
192      0xEE7CD990, 0x4B3D4BEE, 0xA1138B9D, 0x045219E3,
193      0x48F3434F, 0xEDB2D131, 0x079C1142, 0xA2DD833C,
194      0xD62DE755, 0x736C752B, 0x9942B558, 0x3C032726,
195      0xE144FB14, 0x4405696A, 0xAE2BA919, 0x0B6A3B67,
196      0x7F9A5F0E, 0xDADBCD70, 0x30F50D03, 0x95B49F7D,
197      0xD915C5D1, 0x7C5457AF, 0x967A97DC, 0x333B05A2,
198      0x47CB61CB, 0xE28AF3B5, 0x08A433C6, 0xADE5A1B8,
199      0x91E6869E, 0x34A714E0, 0xDE89D493, 0x7BC846ED,
200      0x0F382284, 0xAA79B0FA, 0x40577089, 0xE516E2F7,
201      0xA9B7B85B, 0x0CF62A25, 0xE6D8EA56, 0x43997828,
202      0x37691C41, 0x92288E3F, 0x78064E4C, 0xDD47DC32,
203      0xC76580D9, 0x622412A7, 0x880AD2D4, 0x2D4B40AA,
204      0x59BB24C3, 0xFCFAB6BD, 0x16D476CE, 0xB395E4B0,
205      0xFF34BE1C, 0x5A752C62, 0xB05BEC11, 0x151A7E6F,
206      0x61EA1A06, 0xC4AB8878, 0x2E85480B, 0x8BC4DA75,
207      0xB7C7FD53, 0x12866F2D, 0xF8A8AF5E, 0x5DE93D20,
208      0x29195949, 0x8C58CB37, 0x66760B44, 0xC337993A,
209      0x8F96C396, 0x2AD751E8, 0xC0F9919B, 0x65B803E5,
210      0x1148678C, 0xB409F5F2, 0x5E273581, 0xFB66A7FF,
211      0x26217BCD, 0x8360E9B3, 0x694E29C0, 0xCC0FBBBE,
212      0xB8FFDFD7, 0x1DBE4DA9, 0xF7908DDA, 0x52D11FA4,
213      0x1E704508, 0xBB31D776, 0x511F1705, 0xF45E857B,
214      0x80AEE112, 0x25EF736C, 0xCFC1B31F, 0x6A802161,
215      0x56830647, 0xF3C29439, 0x19EC544A, 0xBCADC634,
216      0xC85DA25D, 0x6D1C3023, 0x8732F050, 0x2273622E,
217      0x6ED23882, 0xCB93AAFC, 0x21BD6A8F, 0x84FCF8F1,
218      0xF00C9C98, 0x554D0EE6, 0xBF63CE95, 0x1A225CEB,
219      0x8B277743, 0x2E66E53D, 0xC448254E, 0x6109B730,
220      0x15F9D359, 0xB0B84127, 0x5A968154, 0xFFD7132A,
221      0xB3764986, 0x1637DBF8, 0xFC191B8B, 0x595889F5,
222      0x2DA8ED9C, 0x88E97FE2, 0x62C7BF91, 0xC7862DEF,
223      0xFB850AC9, 0x5EC498B7, 0xB4EA58C4, 0x11ABCABA,
224      0x655BAED3, 0xC01A3CAD, 0x2A34FCDE, 0x8F756EA0,
225      0xC3D4340C, 0x6695A672, 0x8CBB6601, 0x29FAF47F,
226      0x5D0A9016, 0xF84B0268, 0x1265C21B, 0xB7245065,
227      0x6A638C57, 0xCF221E29, 0x250CDE5A, 0x804D4C24,
228      0xF4BD284D, 0x51FCBA33, 0xBBD27A40, 0x1E93E83E,
229      0x5232B292, 0xF77320EC, 0x1D5DE09F, 0xB81C72E1,
230      0xCCEC1688, 0x69AD84F6, 0x83834485, 0x26C2D6FB,
231      0x1AC1F1DD, 0xBF8063A3, 0x55AEA3D0, 0xF0EF31AE,
232      0x841F55C7, 0x215EC7B9, 0xCB7007CA, 0x6E3195B4,
233      0x2290CF18, 0x87D15D66, 0x6DFF9D15, 0xC8BE0F6B,
234      0xBC4E6B02, 0x190FF97C, 0xF321390F, 0x5660AB71,
235      0x4C42F79A, 0xE90365E4, 0x032DA597, 0xA66C37E9,
236      0xD29C5380, 0x77DDC1FE, 0x9DF3018D, 0x38B293F3,
237      0x7413C95F, 0xD1525B21, 0x3B7C9B52, 0x9E3D092C,
238      0xEACD6D45, 0x4F8CFF3B, 0xA5A23F48, 0x00E3AD36,
239      0x3CE08A10, 0x99A1186E, 0x738FD81D, 0xD6CE4A63,
240      0xA23E2E0A, 0x077FBC74, 0xED517C07, 0x4810EE79,
241      0x04B1B4D5, 0xA1F026AB, 0x4BDEE6D8, 0xEE9F74A6,
242      0x9A6F10CF, 0x3F2E82B1, 0xD50042C2, 0x7041D0BC,
243      0xAD060C8E, 0x08479EF0, 0xE2695E83, 0x4728CCFD,
244      0x33D8A894, 0x96993AEA, 0x7CB7FA99, 0xD9F668E7,
245      0x9557324B, 0x3016A035, 0xDA386046, 0x7F79F238,
246      0x0B899651, 0xAEC8042F, 0x44E6C45C, 0xE1A75622,
247      0xDDA47104, 0x78E5E37A, 0x92CB2309, 0x378AB177,
248      0x437AD51E, 0xE63B4760, 0x0C158713, 0xA954156D,
249      0xE5F54FC1, 0x40B4DDBF, 0xAA9A1DCC, 0x0FDB8FB2,
250      0x7B2BEBDB, 0xDE6A79A5, 0x3444B9D6, 0x91052BA8,
251      /* T8_3 */
252      0x00000000, 0xDD45AAB8, 0xBF672381, 0x62228939,
253      0x7B2231F3, 0xA6679B4B, 0xC4451272, 0x1900B8CA,
254      0xF64463E6, 0x2B01C95E, 0x49234067, 0x9466EADF,
255      0x8D665215, 0x5023F8AD, 0x32017194, 0xEF44DB2C,
256      0xE964B13D, 0x34211B85, 0x560392BC, 0x8B463804,
257      0x924680CE, 0x4F032A76, 0x2D21A34F, 0xF06409F7,
258      0x1F20D2DB, 0xC2657863, 0xA047F15A, 0x7D025BE2,
259      0x6402E328, 0xB9474990, 0xDB65C0A9, 0x06206A11,
260      0xD725148B, 0x0A60BE33, 0x6842370A, 0xB5079DB2,
261      0xAC072578, 0x71428FC0, 0x136006F9, 0xCE25AC41,
262      0x2161776D, 0xFC24DDD5, 0x9E0654EC, 0x4343FE54,
263      0x5A43469E, 0x8706EC26, 0xE524651F, 0x3861CFA7,
264      0x3E41A5B6, 0xE3040F0E, 0x81268637, 0x5C632C8F,
265      0x45639445, 0x98263EFD, 0xFA04B7C4, 0x27411D7C,
266      0xC805C650, 0x15406CE8, 0x7762E5D1, 0xAA274F69,
267      0xB327F7A3, 0x6E625D1B, 0x0C40D422, 0xD1057E9A,
268      0xABA65FE7, 0x76E3F55F, 0x14C17C66, 0xC984D6DE,
269      0xD0846E14, 0x0DC1C4AC, 0x6FE34D95, 0xB2A6E72D,
270      0x5DE23C01, 0x80A796B9, 0xE2851F80, 0x3FC0B538,
271      0x26C00DF2, 0xFB85A74A, 0x99A72E73, 0x44E284CB,
272      0x42C2EEDA, 0x9F874462, 0xFDA5CD5B, 0x20E067E3,
273      0x39E0DF29, 0xE4A57591, 0x8687FCA8, 0x5BC25610,
274      0xB4868D3C, 0x69C32784, 0x0BE1AEBD, 0xD6A40405,
275      0xCFA4BCCF, 0x12E11677, 0x70C39F4E, 0xAD8635F6,
276      0x7C834B6C, 0xA1C6E1D4, 0xC3E468ED, 0x1EA1C255,
277      0x07A17A9F, 0xDAE4D027, 0xB8C6591E, 0x6583F3A6,
278      0x8AC7288A, 0x57828232, 0x35A00B0B, 0xE8E5A1B3,
279      0xF1E51979, 0x2CA0B3C1, 0x4E823AF8, 0x93C79040,
280      0x95E7FA51, 0x48A250E9, 0x2A80D9D0, 0xF7C57368,
281      0xEEC5CBA2, 0x3380611A, 0x51A2E823, 0x8CE7429B,
282      0x63A399B7, 0xBEE6330F, 0xDCC4BA36, 0x0181108E,
283      0x1881A844, 0xC5C402FC, 0xA7E68BC5, 0x7AA3217D,
284      0x52A0C93F, 0x8FE56387, 0xEDC7EABE, 0x30824006,
285      0x2982F8CC, 0xF4C75274, 0x96E5DB4D, 0x4BA071F5,
286      0xA4E4AAD9, 0x79A10061, 0x1B838958, 0xC6C623E0,
287      0xDFC69B2A, 0x02833192, 0x60A1B8AB, 0xBDE41213,
288      0xBBC47802, 0x6681D2BA, 0x04A35B83, 0xD9E6F13B,
289      0xC0E649F1, 0x1DA3E349, 0x7F816A70, 0xA2C4C0C8,
290      0x4D801BE4, 0x90C5B15C, 0xF2E73865, 0x2FA292DD,
291      0x36A22A17, 0xEBE780AF, 0x89C50996, 0x5480A32E,
292      0x8585DDB4, 0x58C0770C, 0x3AE2FE35, 0xE7A7548D,
293      0xFEA7EC47, 0x23E246FF, 0x41C0CFC6, 0x9C85657E,
294      0x73C1BE52, 0xAE8414EA, 0xCCA69DD3, 0x11E3376B,
295      0x08E38FA1, 0xD5A62519, 0xB784AC20, 0x6AC10698,
296      0x6CE16C89, 0xB1A4C631, 0xD3864F08, 0x0EC3E5B0,
297      0x17C35D7A, 0xCA86F7C2, 0xA8A47EFB, 0x75E1D443,
298      0x9AA50F6F, 0x47E0A5D7, 0x25C22CEE, 0xF8878656,
299      0xE1873E9C, 0x3CC29424, 0x5EE01D1D, 0x83A5B7A5,
300      0xF90696D8, 0x24433C60, 0x4661B559, 0x9B241FE1,
301      0x8224A72B, 0x5F610D93, 0x3D4384AA, 0xE0062E12,
302      0x0F42F53E, 0xD2075F86, 0xB025D6BF, 0x6D607C07,
303      0x7460C4CD, 0xA9256E75, 0xCB07E74C, 0x16424DF4,
304      0x106227E5, 0xCD278D5D, 0xAF050464, 0x7240AEDC,
305      0x6B401616, 0xB605BCAE, 0xD4273597, 0x09629F2F,
306      0xE6264403, 0x3B63EEBB, 0x59416782, 0x8404CD3A,
307      0x9D0475F0, 0x4041DF48, 0x22635671, 0xFF26FCC9,
308      0x2E238253, 0xF36628EB, 0x9144A1D2, 0x4C010B6A,
309      0x5501B3A0, 0x88441918, 0xEA669021, 0x37233A99,
310      0xD867E1B5, 0x05224B0D, 0x6700C234, 0xBA45688C,
311      0xA345D046, 0x7E007AFE, 0x1C22F3C7, 0xC167597F,
312      0xC747336E, 0x1A0299D6, 0x782010EF, 0xA565BA57,
313      0xBC65029D, 0x6120A825, 0x0302211C, 0xDE478BA4,
314      0x31035088, 0xEC46FA30, 0x8E647309, 0x5321D9B1,
315      0x4A21617B, 0x9764CBC3, 0xF54642FA, 0x2803E842,
316      /* T8_4 */
317      0x00000000, 0x38116FAC, 0x7022DF58, 0x4833B0F4,
318      0xE045BEB0, 0xD854D11C, 0x906761E8, 0xA8760E44,
319      0xC5670B91, 0xFD76643D, 0xB545D4C9, 0x8D54BB65,
320      0x2522B521, 0x1D33DA8D, 0x55006A79, 0x6D1105D5,
321      0x8F2261D3, 0xB7330E7F, 0xFF00BE8B, 0xC711D127,
322      0x6F67DF63, 0x5776B0CF, 0x1F45003B, 0x27546F97,
323      0x4A456A42, 0x725405EE, 0x3A67B51A, 0x0276DAB6,
324      0xAA00D4F2, 0x9211BB5E, 0xDA220BAA, 0xE2336406,
325      0x1BA8B557, 0x23B9DAFB, 0x6B8A6A0F, 0x539B05A3,
326      0xFBED0BE7, 0xC3FC644B, 0x8BCFD4BF, 0xB3DEBB13,
327      0xDECFBEC6, 0xE6DED16A, 0xAEED619E, 0x96FC0E32,
328      0x3E8A0076, 0x069B6FDA, 0x4EA8DF2E, 0x76B9B082,
329      0x948AD484, 0xAC9BBB28, 0xE4A80BDC, 0xDCB96470,
330      0x74CF6A34, 0x4CDE0598, 0x04EDB56C, 0x3CFCDAC0,
331      0x51EDDF15, 0x69FCB0B9, 0x21CF004D, 0x19DE6FE1,
332      0xB1A861A5, 0x89B90E09, 0xC18ABEFD, 0xF99BD151,
333      0x37516AAE, 0x0F400502, 0x4773B5F6, 0x7F62DA5A,
334      0xD714D41E, 0xEF05BBB2, 0xA7360B46, 0x9F2764EA,
335      0xF236613F, 0xCA270E93, 0x8214BE67, 0xBA05D1CB,
336      0x1273DF8F, 0x2A62B023, 0x625100D7, 0x5A406F7B,
337      0xB8730B7D, 0x806264D1, 0xC851D425, 0xF040BB89,
338      0x5836B5CD, 0x6027DA61, 0x28146A95, 0x10050539,
339      0x7D1400EC, 0x45056F40, 0x0D36DFB4, 0x3527B018,
340      0x9D51BE5C, 0xA540D1F0, 0xED736104, 0xD5620EA8,
341      0x2CF9DFF9, 0x14E8B055, 0x5CDB00A1, 0x64CA6F0D,
342      0xCCBC6149, 0xF4AD0EE5, 0xBC9EBE11, 0x848FD1BD,
343      0xE99ED468, 0xD18FBBC4, 0x99BC0B30, 0xA1AD649C,
344      0x09DB6AD8, 0x31CA0574, 0x79F9B580, 0x41E8DA2C,
345      0xA3DBBE2A, 0x9BCAD186, 0xD3F96172, 0xEBE80EDE,
346      0x439E009A, 0x7B8F6F36, 0x33BCDFC2, 0x0BADB06E,
347      0x66BCB5BB, 0x5EADDA17, 0x169E6AE3, 0x2E8F054F,
348      0x86F90B0B, 0xBEE864A7, 0xF6DBD453, 0xCECABBFF,
349      0x6EA2D55C, 0x56B3BAF0, 0x1E800A04, 0x269165A8,
350      0x8EE76BEC, 0xB6F60440, 0xFEC5B4B4, 0xC6D4DB18,
351      0xABC5DECD, 0x93D4B161, 0xDBE70195, 0xE3F66E39,
352      0x4B80607D, 0x73910FD1, 0x3BA2BF25, 0x03B3D089,
353      0xE180B48F, 0xD991DB23, 0x91A26BD7, 0xA9B3047B,
354      0x01C50A3F, 0x39D46593, 0x71E7D567, 0x49F6BACB,
355      0x24E7BF1E, 0x1CF6D0B2, 0x54C56046, 0x6CD40FEA,
356      0xC4A201AE, 0xFCB36E02, 0xB480DEF6, 0x8C91B15A,
357      0x750A600B, 0x4D1B0FA7, 0x0528BF53, 0x3D39D0FF,
358      0x954FDEBB, 0xAD5EB117, 0xE56D01E3, 0xDD7C6E4F,
359      0xB06D6B9A, 0x887C0436, 0xC04FB4C2, 0xF85EDB6E,
360      0x5028D52A, 0x6839BA86, 0x200A0A72, 0x181B65DE,
361      0xFA2801D8, 0xC2396E74, 0x8A0ADE80, 0xB21BB12C,
362      0x1A6DBF68, 0x227CD0C4, 0x6A4F6030, 0x525E0F9C,
363      0x3F4F0A49, 0x075E65E5, 0x4F6DD511, 0x777CBABD,
364      0xDF0AB4F9, 0xE71BDB55, 0xAF286BA1, 0x9739040D,
365      0x59F3BFF2, 0x61E2D05E, 0x29D160AA, 0x11C00F06,
366      0xB9B60142, 0x81A76EEE, 0xC994DE1A, 0xF185B1B6,
367      0x9C94B463, 0xA485DBCF, 0xECB66B3B, 0xD4A70497,
368      0x7CD10AD3, 0x44C0657F, 0x0CF3D58B, 0x34E2BA27,
369      0xD6D1DE21, 0xEEC0B18D, 0xA6F30179, 0x9EE26ED5,
370      0x36946091, 0x0E850F3D, 0x46B6BFC9, 0x7EA7D065,
371      0x13B6D5B0, 0x2BA7BA1C, 0x63940AE8, 0x5B856544,
372      0xF3F36B00, 0xCBE204AC, 0x83D1B458, 0xBBC0DBF4,
373      0x425B0AA5, 0x7A4A6509, 0x3279D5FD, 0x0A68BA51,
374      0xA21EB415, 0x9A0FDBB9, 0xD23C6B4D, 0xEA2D04E1,
375      0x873C0134, 0xBF2D6E98, 0xF71EDE6C, 0xCF0FB1C0,
376      0x6779BF84, 0x5F68D028, 0x175B60DC, 0x2F4A0F70,
377      0xCD796B76, 0xF56804DA, 0xBD5BB42E, 0x854ADB82,
378      0x2D3CD5C6, 0x152DBA6A, 0x5D1E0A9E, 0x650F6532,
379      0x081E60E7, 0x300F0F4B, 0x783CBFBF, 0x402DD013,
380      0xE85BDE57, 0xD04AB1FB, 0x9879010F, 0xA0686EA3,
381      /* T8_5 */
382      0x00000000, 0xEF306B19, 0xDB8CA0C3, 0x34BCCBDA,
383      0xB2F53777, 0x5DC55C6E, 0x697997B4, 0x8649FCAD,
384      0x6006181F, 0x8F367306, 0xBB8AB8DC, 0x54BAD3C5,
385      0xD2F32F68, 0x3DC34471, 0x097F8FAB, 0xE64FE4B2,
386      0xC00C303E, 0x2F3C5B27, 0x1B8090FD, 0xF4B0FBE4,
387      0x72F90749, 0x9DC96C50, 0xA975A78A, 0x4645CC93,
388      0xA00A2821, 0x4F3A4338, 0x7B8688E2, 0x94B6E3FB,
389      0x12FF1F56, 0xFDCF744F, 0xC973BF95, 0x2643D48C,
390      0x85F4168D, 0x6AC47D94, 0x5E78B64E, 0xB148DD57,
391      0x370121FA, 0xD8314AE3, 0xEC8D8139, 0x03BDEA20,
392      0xE5F20E92, 0x0AC2658B, 0x3E7EAE51, 0xD14EC548,
393      0x570739E5, 0xB83752FC, 0x8C8B9926, 0x63BBF23F,
394      0x45F826B3, 0xAAC84DAA, 0x9E748670, 0x7144ED69,
395      0xF70D11C4, 0x183D7ADD, 0x2C81B107, 0xC3B1DA1E,
396      0x25FE3EAC, 0xCACE55B5, 0xFE729E6F, 0x1142F576,
397      0x970B09DB, 0x783B62C2, 0x4C87A918, 0xA3B7C201,
398      0x0E045BEB, 0xE13430F2, 0xD588FB28, 0x3AB89031,
399      0xBCF16C9C, 0x53C10785, 0x677DCC5F, 0x884DA746,
400      0x6E0243F4, 0x813228ED, 0xB58EE337, 0x5ABE882E,
401      0xDCF77483, 0x33C71F9A, 0x077BD440, 0xE84BBF59,
402      0xCE086BD5, 0x213800CC, 0x1584CB16, 0xFAB4A00F,
403      0x7CFD5CA2, 0x93CD37BB, 0xA771FC61, 0x48419778,
404      0xAE0E73CA, 0x413E18D3, 0x7582D309, 0x9AB2B810,
405      0x1CFB44BD, 0xF3CB2FA4, 0xC777E47E, 0x28478F67,
406      0x8BF04D66, 0x64C0267F, 0x507CEDA5, 0xBF4C86BC,
407      0x39057A11, 0xD6351108, 0xE289DAD2, 0x0DB9B1CB,
408      0xEBF65579, 0x04C63E60, 0x307AF5BA, 0xDF4A9EA3,
409      0x5903620E, 0xB6330917, 0x828FC2CD, 0x6DBFA9D4,
410      0x4BFC7D58, 0xA4CC1641, 0x9070DD9B, 0x7F40B682,
411      0xF9094A2F, 0x16392136, 0x2285EAEC, 0xCDB581F5,
412      0x2BFA6547, 0xC4CA0E5E, 0xF076C584, 0x1F46AE9D,
413      0x990F5230, 0x763F3929, 0x4283F2F3, 0xADB399EA,
414      0x1C08B7D6, 0xF338DCCF, 0xC7841715, 0x28B47C0C,
415      0xAEFD80A1, 0x41CDEBB8, 0x75712062, 0x9A414B7B,
416      0x7C0EAFC9, 0x933EC4D0, 0xA7820F0A, 0x48B26413,
417      0xCEFB98BE, 0x21CBF3A7, 0x1577387D, 0xFA475364,
418      0xDC0487E8, 0x3334ECF1, 0x0788272B, 0xE8B84C32,
419      0x6EF1B09F, 0x81C1DB86, 0xB57D105C, 0x5A4D7B45,
420      0xBC029FF7, 0x5332F4EE, 0x678E3F34, 0x88BE542D,
421      0x0EF7A880, 0xE1C7C399, 0xD57B0843, 0x3A4B635A,
422      0x99FCA15B, 0x76CCCA42, 0x42700198, 0xAD406A81,
423      0x2B09962C, 0xC439FD35, 0xF08536EF, 0x1FB55DF6,
424      0xF9FAB944, 0x16CAD25D, 0x22761987, 0xCD46729E,
425      0x4B0F8E33, 0xA43FE52A, 0x90832EF0, 0x7FB345E9,
426      0x59F09165, 0xB6C0FA7C, 0x827C31A6, 0x6D4C5ABF,
427      0xEB05A612, 0x0435CD0B, 0x308906D1, 0xDFB96DC8,
428      0x39F6897A, 0xD6C6E263, 0xE27A29B9, 0x0D4A42A0,
429      0x8B03BE0D, 0x6433D514, 0x508F1ECE, 0xBFBF75D7,
430      0x120CEC3D, 0xFD3C8724, 0xC9804CFE, 0x26B027E7,
431      0xA0F9DB4A, 0x4FC9B053, 0x7B757B89, 0x94451090,
432      0x720AF422, 0x9D3A9F3B, 0xA98654E1, 0x46B63FF8,
433      0xC0FFC355, 0x2FCFA84C, 0x1B736396, 0xF443088F,
434      0xD200DC03, 0x3D30B71A, 0x098C7CC0, 0xE6BC17D9,
435      0x60F5EB74, 0x8FC5806D, 0xBB794BB7, 0x544920AE,
436      0xB206C41C, 0x5D36AF05, 0x698A64DF, 0x86BA0FC6,
437      0x00F3F36B, 0xEFC39872, 0xDB7F53A8, 0x344F38B1,
438      0x97F8FAB0, 0x78C891A9, 0x4C745A73, 0xA344316A,
439      0x250DCDC7, 0xCA3DA6DE, 0xFE816D04, 0x11B1061D,
440      0xF7FEE2AF, 0x18CE89B6, 0x2C72426C, 0xC3422975,
441      0x450BD5D8, 0xAA3BBEC1, 0x9E87751B, 0x71B71E02,
442      0x57F4CA8E, 0xB8C4A197, 0x8C786A4D, 0x63480154,
443      0xE501FDF9, 0x0A3196E0, 0x3E8D5D3A, 0xD1BD3623,
444      0x37F2D291, 0xD8C2B988, 0xEC7E7252, 0x034E194B,
445      0x8507E5E6, 0x6A378EFF, 0x5E8B4525, 0xB1BB2E3C,
446      /* T8_6 */
447      0x00000000, 0x68032CC8, 0xD0065990, 0xB8057558,
448      0xA5E0C5D1, 0xCDE3E919, 0x75E69C41, 0x1DE5B089,
449      0x4E2DFD53, 0x262ED19B, 0x9E2BA4C3, 0xF628880B,
450      0xEBCD3882, 0x83CE144A, 0x3BCB6112, 0x53C84DDA,
451      0x9C5BFAA6, 0xF458D66E, 0x4C5DA336, 0x245E8FFE,
452      0x39BB3F77, 0x51B813BF, 0xE9BD66E7, 0x81BE4A2F,
453      0xD27607F5, 0xBA752B3D, 0x02705E65, 0x6A7372AD,
454      0x7796C224, 0x1F95EEEC, 0xA7909BB4, 0xCF93B77C,
455      0x3D5B83BD, 0x5558AF75, 0xED5DDA2D, 0x855EF6E5,
456      0x98BB466C, 0xF0B86AA4, 0x48BD1FFC, 0x20BE3334,
457      0x73767EEE, 0x1B755226, 0xA370277E, 0xCB730BB6,
458      0xD696BB3F, 0xBE9597F7, 0x0690E2AF, 0x6E93CE67,
459      0xA100791B, 0xC90355D3, 0x7106208B, 0x19050C43,
460      0x04E0BCCA, 0x6CE39002, 0xD4E6E55A, 0xBCE5C992,
461      0xEF2D8448, 0x872EA880, 0x3F2BDDD8, 0x5728F110,
462      0x4ACD4199, 0x22CE6D51, 0x9ACB1809, 0xF2C834C1,
463      0x7AB7077A, 0x12B42BB2, 0xAAB15EEA, 0xC2B27222,
464      0xDF57C2AB, 0xB754EE63, 0x0F519B3B, 0x6752B7F3,
465      0x349AFA29, 0x5C99D6E1, 0xE49CA3B9, 0x8C9F8F71,
466      0x917A3FF8, 0xF9791330, 0x417C6668, 0x297F4AA0,
467      0xE6ECFDDC, 0x8EEFD114, 0x36EAA44C, 0x5EE98884,
468      0x430C380D, 0x2B0F14C5, 0x930A619D, 0xFB094D55,
469      0xA8C1008F, 0xC0C22C47, 0x78C7591F, 0x10C475D7,
470      0x0D21C55E, 0x6522E996, 0xDD279CCE, 0xB524B006,
471      0x47EC84C7, 0x2FEFA80F, 0x97EADD57, 0xFFE9F19F,
472      0xE20C4116, 0x8A0F6DDE, 0x320A1886, 0x5A09344E,
473      0x09C17994, 0x61C2555C, 0xD9C72004, 0xB1C40CCC,
474      0xAC21BC45, 0xC422908D, 0x7C27E5D5, 0x1424C91D,
475      0xDBB77E61, 0xB3B452A9, 0x0BB127F1, 0x63B20B39,
476      0x7E57BBB0, 0x16549778, 0xAE51E220, 0xC652CEE8,
477      0x959A8332, 0xFD99AFFA, 0x459CDAA2, 0x2D9FF66A,
478      0x307A46E3, 0x58796A2B, 0xE07C1F73, 0x887F33BB,
479      0xF56E0EF4, 0x9D6D223C, 0x25685764, 0x4D6B7BAC,
480      0x508ECB25, 0x388DE7ED, 0x808892B5, 0xE88BBE7D,
481      0xBB43F3A7, 0xD340DF6F, 0x6B45AA37, 0x034686FF,
482      0x1EA33676, 0x76A01ABE, 0xCEA56FE6, 0xA6A6432E,
483      0x6935F452, 0x0136D89A, 0xB933ADC2, 0xD130810A,
484      0xCCD53183, 0xA4D61D4B, 0x1CD36813, 0x74D044DB,
485      0x27180901, 0x4F1B25C9, 0xF71E5091, 0x9F1D7C59,
486      0x82F8CCD0, 0xEAFBE018, 0x52FE9540, 0x3AFDB988,
487      0xC8358D49, 0xA036A181, 0x1833D4D9, 0x7030F811,
488      0x6DD54898, 0x05D66450, 0xBDD31108, 0xD5D03DC0,
489      0x8618701A, 0xEE1B5CD2, 0x561E298A, 0x3E1D0542,
490      0x23F8B5CB, 0x4BFB9903, 0xF3FEEC5B, 0x9BFDC093,
491      0x546E77EF, 0x3C6D5B27, 0x84682E7F, 0xEC6B02B7,
492      0xF18EB23E, 0x998D9EF6, 0x2188EBAE, 0x498BC766,
493      0x1A438ABC, 0x7240A674, 0xCA45D32C, 0xA246FFE4,
494      0xBFA34F6D, 0xD7A063A5, 0x6FA516FD, 0x07A63A35,
495      0x8FD9098E, 0xE7DA2546, 0x5FDF501E, 0x37DC7CD6,
496      0x2A39CC5F, 0x423AE097, 0xFA3F95CF, 0x923CB907,
497      0xC1F4F4DD, 0xA9F7D815, 0x11F2AD4D, 0x79F18185,
498      0x6414310C, 0x0C171DC4, 0xB412689C, 0xDC114454,
499      0x1382F328, 0x7B81DFE0, 0xC384AAB8, 0xAB878670,
500      0xB66236F9, 0xDE611A31, 0x66646F69, 0x0E6743A1,
501      0x5DAF0E7B, 0x35AC22B3, 0x8DA957EB, 0xE5AA7B23,
502      0xF84FCBAA, 0x904CE762, 0x2849923A, 0x404ABEF2,
503      0xB2828A33, 0xDA81A6FB, 0x6284D3A3, 0x0A87FF6B,
504      0x17624FE2, 0x7F61632A, 0xC7641672, 0xAF673ABA,
505      0xFCAF7760, 0x94AC5BA8, 0x2CA92EF0, 0x44AA0238,
506      0x594FB2B1, 0x314C9E79, 0x8949EB21, 0xE14AC7E9,
507      0x2ED97095, 0x46DA5C5D, 0xFEDF2905, 0x96DC05CD,
508      0x8B39B544, 0xE33A998C, 0x5B3FECD4, 0x333CC01C,
509      0x60F48DC6, 0x08F7A10E, 0xB0F2D456, 0xD8F1F89E,
510      0xC5144817, 0xAD1764DF, 0x15121187, 0x7D113D4F,
511      /* T8_7 */
512      0x00000000, 0x493C7D27, 0x9278FA4E, 0xDB448769,
513      0x211D826D, 0x6821FF4A, 0xB3657823, 0xFA590504,
514      0x423B04DA, 0x0B0779FD, 0xD043FE94, 0x997F83B3,
515      0x632686B7, 0x2A1AFB90, 0xF15E7CF9, 0xB86201DE,
516      0x847609B4, 0xCD4A7493, 0x160EF3FA, 0x5F328EDD,
517      0xA56B8BD9, 0xEC57F6FE, 0x37137197, 0x7E2F0CB0,
518      0xC64D0D6E, 0x8F717049, 0x5435F720, 0x1D098A07,
519      0xE7508F03, 0xAE6CF224, 0x7528754D, 0x3C14086A,
520      0x0D006599, 0x443C18BE, 0x9F789FD7, 0xD644E2F0,
521      0x2C1DE7F4, 0x65219AD3, 0xBE651DBA, 0xF759609D,
522      0x4F3B6143, 0x06071C64, 0xDD439B0D, 0x947FE62A,
523      0x6E26E32E, 0x271A9E09, 0xFC5E1960, 0xB5626447,
524      0x89766C2D, 0xC04A110A, 0x1B0E9663, 0x5232EB44,
525      0xA86BEE40, 0xE1579367, 0x3A13140E, 0x732F6929,
526      0xCB4D68F7, 0x827115D0, 0x593592B9, 0x1009EF9E,
527      0xEA50EA9A, 0xA36C97BD, 0x782810D4, 0x31146DF3,
528      0x1A00CB32, 0x533CB615, 0x8878317C, 0xC1444C5B,
529      0x3B1D495F, 0x72213478, 0xA965B311, 0xE059CE36,
530      0x583BCFE8, 0x1107B2CF, 0xCA4335A6, 0x837F4881,
531      0x79264D85, 0x301A30A2, 0xEB5EB7CB, 0xA262CAEC,
532      0x9E76C286, 0xD74ABFA1, 0x0C0E38C8, 0x453245EF,
533      0xBF6B40EB, 0xF6573DCC, 0x2D13BAA5, 0x642FC782,
534      0xDC4DC65C, 0x9571BB7B, 0x4E353C12, 0x07094135,
535      0xFD504431, 0xB46C3916, 0x6F28BE7F, 0x2614C358,
536      0x1700AEAB, 0x5E3CD38C, 0x857854E5, 0xCC4429C2,
537      0x361D2CC6, 0x7F2151E1, 0xA465D688, 0xED59ABAF,
538      0x553BAA71, 0x1C07D756, 0xC743503F, 0x8E7F2D18,
539      0x7426281C, 0x3D1A553B, 0xE65ED252, 0xAF62AF75,
540      0x9376A71F, 0xDA4ADA38, 0x010E5D51, 0x48322076,
541      0xB26B2572, 0xFB575855, 0x2013DF3C, 0x692FA21B,
542      0xD14DA3C5, 0x9871DEE2, 0x4335598B, 0x0A0924AC,
543      0xF05021A8, 0xB96C5C8F, 0x6228DBE6, 0x2B14A6C1,
544      0x34019664, 0x7D3DEB43, 0xA6796C2A, 0xEF45110D,
545      0x151C1409, 0x5C20692E, 0x8764EE47, 0xCE589360,
546      0x763A92BE, 0x3F06EF99, 0xE44268F0, 0xAD7E15D7,
547      0x572710D3, 0x1E1B6DF4, 0xC55FEA9D, 0x8C6397BA,
548      0xB0779FD0, 0xF94BE2F7, 0x220F659E, 0x6B3318B9,
549      0x916A1DBD, 0xD856609A, 0x0312E7F3, 0x4A2E9AD4,
550      0xF24C9B0A, 0xBB70E62D, 0x60346144, 0x29081C63,
551      0xD3511967, 0x9A6D6440, 0x4129E329, 0x08159E0E,
552      0x3901F3FD, 0x703D8EDA, 0xAB7909B3, 0xE2457494,
553      0x181C7190, 0x51200CB7, 0x8A648BDE, 0xC358F6F9,
554      0x7B3AF727, 0x32068A00, 0xE9420D69, 0xA07E704E,
555      0x5A27754A, 0x131B086D, 0xC85F8F04, 0x8163F223,
556      0xBD77FA49, 0xF44B876E, 0x2F0F0007, 0x66337D20,
557      0x9C6A7824, 0xD5560503, 0x0E12826A, 0x472EFF4D,
558      0xFF4CFE93, 0xB67083B4, 0x6D3404DD, 0x240879FA,
559      0xDE517CFE, 0x976D01D9, 0x4C2986B0, 0x0515FB97,
560      0x2E015D56, 0x673D2071, 0xBC79A718, 0xF545DA3F,
561      0x0F1CDF3B, 0x4620A21C, 0x9D642575, 0xD4585852,
562      0x6C3A598C, 0x250624AB, 0xFE42A3C2, 0xB77EDEE5,
563      0x4D27DBE1, 0x041BA6C6, 0xDF5F21AF, 0x96635C88,
564      0xAA7754E2, 0xE34B29C5, 0x380FAEAC, 0x7133D38B,
565      0x8B6AD68F, 0xC256ABA8, 0x19122CC1, 0x502E51E6,
566      0xE84C5038, 0xA1702D1F, 0x7A34AA76, 0x3308D751,
567      0xC951D255, 0x806DAF72, 0x5B29281B, 0x1215553C,
568      0x230138CF, 0x6A3D45E8, 0xB179C281, 0xF845BFA6,
569      0x021CBAA2, 0x4B20C785, 0x906440EC, 0xD9583DCB,
570      0x613A3C15, 0x28064132, 0xF342C65B, 0xBA7EBB7C,
571      0x4027BE78, 0x091BC35F, 0xD25F4436, 0x9B633911,
572      0xA777317B, 0xEE4B4C5C, 0x350FCB35, 0x7C33B612,
573      0x866AB316, 0xCF56CE31, 0x14124958, 0x5D2E347F,
574      0xE54C35A1, 0xAC704886, 0x7734CFEF, 0x3E08B2C8,
575      0xC451B7CC, 0x8D6DCAEB, 0x56294D82, 0x1F1530A5
576    };
577    // @formatter:on
578
579    /** The current CRC value, bit-flipped */
580    private int crc;
581
582    /** Create a new PureJavaCrc32 object. */
583    public PureJavaCrc32C() {
584        reset();
585    }
586
587    @Override
588    public long getValue() {
589        final long ret = crc;
590        return ~ret & 0xffffffffL;
591    }
592
593    @Override
594    public void reset() {
595        crc = 0xffffffff;
596    }
597
598    @Override
599    public void update(final byte[] b, int off, int len) {
600        int localCrc = crc;
601
602        while (len > 7) {
603            final int c0 = (b[off + 0] ^ localCrc) & 0xff;
604            final int c1 = (b[off + 1] ^ (localCrc >>>= 8)) & 0xff;
605            final int c2 = (b[off + 2] ^ (localCrc >>>= 8)) & 0xff;
606            final int c3 = (b[off + 3] ^ (localCrc >>>= 8)) & 0xff;
607            localCrc = T[T8_7_START + c0] ^ T[T8_6_START + c1] ^ T[T8_5_START + c2] ^ T[T8_4_START + c3];
608
609            final int c4 = b[off + 4] & 0xff;
610            final int c5 = b[off + 5] & 0xff;
611            final int c6 = b[off + 6] & 0xff;
612            final int c7 = b[off + 7] & 0xff;
613
614            localCrc ^= T[T8_3_START + c4] ^ T[T8_2_START + c5] ^ T[T8_1_START + c6] ^ T[T8_0_START + c7];
615
616            off += 8;
617            len -= 8;
618        }
619
620        /* loop unroll - duff's device style */
621        switch (len) {
622        case 7:
623            localCrc = localCrc >>> 8 ^ T[T8_0_START + ((localCrc ^ b[off++]) & 0xff)];
624        case 6:
625            localCrc = localCrc >>> 8 ^ T[T8_0_START + ((localCrc ^ b[off++]) & 0xff)];
626        case 5:
627            localCrc = localCrc >>> 8 ^ T[T8_0_START + ((localCrc ^ b[off++]) & 0xff)];
628        case 4:
629            localCrc = localCrc >>> 8 ^ T[T8_0_START + ((localCrc ^ b[off++]) & 0xff)];
630        case 3:
631            localCrc = localCrc >>> 8 ^ T[T8_0_START + ((localCrc ^ b[off++]) & 0xff)];
632        case 2:
633            localCrc = localCrc >>> 8 ^ T[T8_0_START + ((localCrc ^ b[off++]) & 0xff)];
634        case 1:
635            localCrc = localCrc >>> 8 ^ T[T8_0_START + ((localCrc ^ b[off++]) & 0xff)];
636        default:
637            break; // satisfy Findbugs
638        }
639
640        // Publish crc out to object
641        crc = localCrc;
642    }
643
644    @Override
645    final public void update(final int b) {
646        crc = crc >>> 8 ^ T[T8_0_START + ((crc ^ b) & 0xff)];
647    }
648
649}