3 * $Id: crc32.c,v 1.2 1999/05/05 18:50:31 mdw Exp $
5 * Calculating cyclic redundancy values (non-cryptographic!)
7 * (c) 1998 Straylight/Edgeware
10 /*----- Licensing notice --------------------------------------------------*
12 * This file is part of the mLib utilities library.
14 * mLib is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU Library General Public License as
16 * published by the Free Software Foundation; either version 2 of the
17 * License, or (at your option) any later version.
19 * mLib is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Library General Public License for more details.
24 * You should have received a copy of the GNU Library General Public
25 * License along with mLib; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 /*----- Revision history --------------------------------------------------*
32 * Revision 1.2 1999/05/05 18:50:31 mdw
33 * Change licensing conditions to LGPL.
35 * Revision 1.1.1.1 1998/06/17 23:44:42 mdw
36 * Initial version of mLib
40 /*----- Header files ------------------------------------------------------*/
42 /* --- ANSI headers --- */
48 /* --- Local headers --- */
52 /*----- CRC table ---------------------------------------------------------*/
54 /* --- Acknowledgements and information --- *
56 * This table was generated using a derivative of the Rocksoft Model CRC
57 * generator. The parameters given are:
64 * check = crc(123456789) = 0xCBF43926
67 unsigned long crc32_table[256] = {
68 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
69 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
70 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
71 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
72 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
73 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
74 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
75 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
76 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
77 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
78 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
79 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
80 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
81 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
82 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
83 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
84 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
85 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
86 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
87 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
88 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
89 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
90 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
91 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
92 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
93 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
94 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
95 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
96 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
97 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
98 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
99 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
100 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
101 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
102 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
103 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
104 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
105 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
106 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
107 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
108 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
109 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
110 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
111 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
112 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
113 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
114 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
115 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
116 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
117 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
118 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
119 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
120 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
121 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
122 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
123 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
124 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
125 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
126 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
127 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
128 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
129 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
130 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
131 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL,
134 /*----- Functionc provided ------------------------------------------------*/
138 * Arguments: @unsigned long crc@ = carryover from previous call, or zero
139 * @const void *buf@ = pointer to buffer to check
140 * @size_t sz@ = size of the buffer
142 * Returns: The CRC updated by the new buffer.
144 * Use: A restartable CRC calculator. This is just a function
145 * wrapper for the macro version.
148 unsigned long crc32(unsigned long crc, const void *buf, size_t sz)
151 CRC32(c, crc, buf, sz);
155 /*----- Test driver -------------------------------------------------------*/
163 unsigned long crc = 0;
168 r = fread(buf, 1, sizeof(buf), stdin);
170 crc = crc32(crc, buf, r);
171 } while (r == sizeof(buf));
173 printf("crc32(stdin) = %08lx\n", crc);
179 /*----- That's all, folks -------------------------------------------------*/