B.1 CRC calculation using tables, for the polynomial 0xF4ACFB13

The calculation of a 32-bit CRC signature over an array of N octets with the help of lookup tables, using “C” as programming language, is shown below:

// VARIANT A: presumably easier to implement on little endian machines

uint32_t crctab32[256]; // lookup table

uint32_t CRC32_Backward(char *array, int16_t N){ // input is array of N octets

// containing the data,
see Figure 23

uint32_t result = 1; // seed value for the calculated CRC

int16_t i; // index

for(i=N-1;i>=0;i--) // process array in reversed order

result = crctab32 [((result >> 24) ^ array[i]) & 0xff] ^ (result << 8);

if (result==0)
return 1;
else
return result;

}

where the lookup-table crctab32 has to be initialized as shown in Table B.1.

// VARIANT B: presumably easier to implement on big endian machines

uint32_t crctab32[256]; // lookup table

uint32_t CRC32_Forward(char *array, int16_t N){ // input is array of N octets

// containing the data in reversed

// order, see e. g. Figure 24

uint32_t result = 1; // seed value for the calculated CRC

int16_t i; // index

for(i=0;i<N;i++) // process array

result = crctab32 [((result >> 24) ^ array[i]) & 0xff] ^ (result << 8);

if (result==0)
return 1;
else
return result;

}

where the lookup-table crctab32 has to be initialized as shown in Table B.1.

Table B.1 – The CRC32 lookup table for 32-bit CRC signature calculations
CRC32 lookup table (0 to 255)
00000000F4ACFB131DF50D35E959F6263BEA1A6ACF46E179261F175FD2B3EC4C
77D434D48378CFC76A2139E19E8DC2F24C3E2EBEB892D5AD51CB238BA567D898
EFA869A81B0492BBF25D649D06F19F8ED44273C220EE88D1C9B77EF73D1B85E4
987C5D7C6CD0A66F858950497125AB5AA3964716573ABC05BE634A234ACFB130
2BFC2843DF50D35036092576C2A5DE6510163229E4BAC93A0DE33F1CF94FC40F
5C281C97A884E78441DD11A2B571EAB167C206FD936EFDEE7A370BC88E9BF0DB
C45441EB30F8BAF8D9A14CDE2D0DB7CDFFBE5B810B12A092E24B56B416E7ADA7
B380753F472C8E2CAE75780A5AD98319886A6F557CC69446959F626061339973
57F85086A354AB954A0D5DB3BEA1A6A06C124AEC98BEB1FF71E747D9854BBCCA
202C6452D4809F413DD96967C97592741BC67E38EF6A852B0633730DF29F881E
B850392E4CFCC23DA5A5341B5109CF0883BA23447716D8579E4F2E716AE3D562
CF840DFA3B28F6E9D27100CF26DDFBDCF46E179000C2EC83E99B1AA51D37E1B6
7C0478C588A883D661F175F0955D8EE347EE62AFB34299BC5A1B6F9AAEB79489
0BD04C11FF7CB70216254124E289BA37303A567BC496AD682DCF5B4ED963A05D
93AC116D6700EA7E8E591C587AF5E74BA8460B075CEAF014B5B30632411FFD21
E47825B910D4DEAAF98D288C0D21D39FDF923FD32B3EC4C0C26732E636CBC9F5
AFF0A10C5B5C5A1FB205AC3946A9572A941ABB6660B6407589EFB6537D434D40
D82495D82C886ECBC5D198ED317D63FEE3CE8FB2176274A1FE3B82870A977994
4058C8A4B4F433B75DADC591A9013E827BB2D2CE8F1E29DD6647DFFB92EB24E8
378CFC70C32007632A79F145DED50A560C66E61AF8CA1D091193EB2FE53F103C
840C894F70A0725C99F9847A6D557F69BFE693254B4A6836A2139E1056BF6503
F3D8BD9B07744688EE2DB0AE1A814BBDC832A7F13C9E5CE2D5C7AAC4216B51D7
6BA4E0E79F081BF47651EDD282FD16C1504EFA8DA4E2019E4DBBF7B8B9170CAB
1C70D433E8DC2F200185D906F5292215279ACE59D336354A3A6FC36CCEC3387F
F808F18A0CA40A99E5FDFCBF115107ACC3E2EBE0374E10F3DE17E6D52ABB1DC6
8FDCC55E7B703E4D9229C86B66853378B436DF34409A2427A9C3D2015D6F2912
17A09822E30C63310A559517FEF96E042C4A8248D8E6795B31BF8F7DC513746E
6074ACF694D857E57D81A1C3892D5AD05B9EB69CAF324D8F466BBBA9B2C740BA
D3F4D9C9275822DACE01D4FC3AAD2FEFE81EC3A31CB238B0F5EBCE9601473585
A420ED1D508C160EB9D5E0284D791B3B9FCAF7776B660C64823FFA4276930151
3C5CB061C8F04B7221A9BD54D505464707B6AA0BF31A51181A43A73EEEEF5C2D
4B8884B5BF247FA6567D8980A2D1729370629EDF84CE65CC6D9793EA993B68F9
This table contains 32-bit values in hexadecimal representation for each value (0 to 255) of the argument a in the function crctab32 [a]. The table should be used line-by-line in ascending order from top left (0) to bottom right (255). For instance, crctab32[10] is highlighted using a darker background and red colour.