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