2 * SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2009-2021 Free Software Foundation, Inc.
6 /* Copied from https://github.com/gcc-mirror/gcc/blob/master/libiberty/crc32.c
7 * and then tweaked a little. */
9 /* This table was generated by the following program.
17 for (i = 0; i < 256; i++)
19 for (c = i << 24, j = 8; j > 0; --j)
20 c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
23 printf ("static const unsigned int crc32_table[] =\n{\n");
24 for (i = 0; i < 256; i += 4)
26 printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x",
27 table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
35 For more information on CRC, see, e.g.,
36 http://www.ross.net/crc/download/crc_v3.txt. */
38 static const unsigned int crc32_table[] = {
39 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
40 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
41 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
42 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
43 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
44 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
45 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
46 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
47 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
48 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
49 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
50 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
51 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
52 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
53 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
54 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
55 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
56 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
57 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
58 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
59 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
60 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
61 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
62 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
63 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
64 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
65 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
66 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
67 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
68 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
69 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
70 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
71 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
72 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
73 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
74 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
75 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
76 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
77 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
78 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
79 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
80 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
81 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
82 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
83 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
84 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
85 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
86 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
87 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
88 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
89 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
90 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
91 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
92 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
93 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
94 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
95 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
96 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
97 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
98 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
99 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
100 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
101 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
102 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
106 @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
107 int @var{len}, unsigned int @var{init})
108 Compute the 32-bit CRC of @var{buf} which has length @var{len}. The
109 starting value is 0xffffffff.
110 This is used by the @command{gdb} remote protocol for the @samp{qCRC}
112 This CRC can be specified as:
119 This differs from the "standard" CRC-32 algorithm in that the values
120 are not reflected, and there is no final XOR value. These differences
121 make it easy to compose the values of multiple blocks.
128 xcrc32(const unsigned char *buf, int len)
130 uint32_t crc = 0xffffffff;
132 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];