Developer Documentation
crc32.cc
1 /*
2 -------------------------------------------------------------------------------
3 
4  Philips 3D Solutions - Eindhoven
5 
6  CRC32 implementation adapted from public domain code written by Eric Durbin.
7  Original header follows
8 
9 -- START OF ORIGINAL HEADER ---------------------------------------------------
10 
11  crc32.cc
12 
13  C implementation of CRC-32 checksums for NAACCR records. Code is based
14  upon and utilizes algorithm published by Ross Williams.
15 
16  This file contains:
17  CRC lookup table
18  function CalcCRC32 for calculating CRC-32 checksum
19  function AssignCRC32 for assigning CRC-32 in NAACCR record
20  function CheckCRC32 for checking CRC-32 in NAACCR record
21 
22  Provided by:
23  Eric Durbin
24  Kentucky Cancer Registry
25  University of Kentucky
26  October 14, 1998
27 
28  Status:
29  Public Domain
30 
31 -- END OF ORIGINAL HEADER -----------------------------------------------------
32 */
33 
34 #include "crc32.hh"
35 
36 /*****************************************************************/
37 /* */
38 /* CRC LOOKUP TABLE */
39 /* ================ */
40 /* The following CRC lookup table was generated automagically */
41 /* by the Rocksoft^tm Model CRC Algorithm Table Generation */
42 /* Program V1.0 using the following model parameters: */
43 /* */
44 /* Width : 4 bytes. */
45 /* Poly : 0x04C11DB7L */
46 /* Reverse : FALSE. */
47 /* */
48 /* For more information on the Rocksoft^tm Model CRC Algorithm, */
49 /* see the document titled "A Painless Guide to CRC Error */
50 /* Detection Algorithms" by Ross Williams */
51 /* (ross@guest.adelaide.edu.au.). This document is likely to be */
52 /* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */
53 /* */
54 /*****************************************************************/
55 
56 unsigned long crctable[256] =
57 {
58 0x00000000L, 0x04C11DB7L, 0x09823B6EL, 0x0D4326D9L,
59 0x130476DCL, 0x17C56B6BL, 0x1A864DB2L, 0x1E475005L,
60 0x2608EDB8L, 0x22C9F00FL, 0x2F8AD6D6L, 0x2B4BCB61L,
61 0x350C9B64L, 0x31CD86D3L, 0x3C8EA00AL, 0x384FBDBDL,
62 0x4C11DB70L, 0x48D0C6C7L, 0x4593E01EL, 0x4152FDA9L,
63 0x5F15ADACL, 0x5BD4B01BL, 0x569796C2L, 0x52568B75L,
64 0x6A1936C8L, 0x6ED82B7FL, 0x639B0DA6L, 0x675A1011L,
65 0x791D4014L, 0x7DDC5DA3L, 0x709F7B7AL, 0x745E66CDL,
66 0x9823B6E0L, 0x9CE2AB57L, 0x91A18D8EL, 0x95609039L,
67 0x8B27C03CL, 0x8FE6DD8BL, 0x82A5FB52L, 0x8664E6E5L,
68 0xBE2B5B58L, 0xBAEA46EFL, 0xB7A96036L, 0xB3687D81L,
69 0xAD2F2D84L, 0xA9EE3033L, 0xA4AD16EAL, 0xA06C0B5DL,
70 0xD4326D90L, 0xD0F37027L, 0xDDB056FEL, 0xD9714B49L,
71 0xC7361B4CL, 0xC3F706FBL, 0xCEB42022L, 0xCA753D95L,
72 0xF23A8028L, 0xF6FB9D9FL, 0xFBB8BB46L, 0xFF79A6F1L,
73 0xE13EF6F4L, 0xE5FFEB43L, 0xE8BCCD9AL, 0xEC7DD02DL,
74 0x34867077L, 0x30476DC0L, 0x3D044B19L, 0x39C556AEL,
75 0x278206ABL, 0x23431B1CL, 0x2E003DC5L, 0x2AC12072L,
76 0x128E9DCFL, 0x164F8078L, 0x1B0CA6A1L, 0x1FCDBB16L,
77 0x018AEB13L, 0x054BF6A4L, 0x0808D07DL, 0x0CC9CDCAL,
78 0x7897AB07L, 0x7C56B6B0L, 0x71159069L, 0x75D48DDEL,
79 0x6B93DDDBL, 0x6F52C06CL, 0x6211E6B5L, 0x66D0FB02L,
80 0x5E9F46BFL, 0x5A5E5B08L, 0x571D7DD1L, 0x53DC6066L,
81 0x4D9B3063L, 0x495A2DD4L, 0x44190B0DL, 0x40D816BAL,
82 0xACA5C697L, 0xA864DB20L, 0xA527FDF9L, 0xA1E6E04EL,
83 0xBFA1B04BL, 0xBB60ADFCL, 0xB6238B25L, 0xB2E29692L,
84 0x8AAD2B2FL, 0x8E6C3698L, 0x832F1041L, 0x87EE0DF6L,
85 0x99A95DF3L, 0x9D684044L, 0x902B669DL, 0x94EA7B2AL,
86 0xE0B41DE7L, 0xE4750050L, 0xE9362689L, 0xEDF73B3EL,
87 0xF3B06B3BL, 0xF771768CL, 0xFA325055L, 0xFEF34DE2L,
88 0xC6BCF05FL, 0xC27DEDE8L, 0xCF3ECB31L, 0xCBFFD686L,
89 0xD5B88683L, 0xD1799B34L, 0xDC3ABDEDL, 0xD8FBA05AL,
90 0x690CE0EEL, 0x6DCDFD59L, 0x608EDB80L, 0x644FC637L,
91 0x7A089632L, 0x7EC98B85L, 0x738AAD5CL, 0x774BB0EBL,
92 0x4F040D56L, 0x4BC510E1L, 0x46863638L, 0x42472B8FL,
93 0x5C007B8AL, 0x58C1663DL, 0x558240E4L, 0x51435D53L,
94 0x251D3B9EL, 0x21DC2629L, 0x2C9F00F0L, 0x285E1D47L,
95 0x36194D42L, 0x32D850F5L, 0x3F9B762CL, 0x3B5A6B9BL,
96 0x0315D626L, 0x07D4CB91L, 0x0A97ED48L, 0x0E56F0FFL,
97 0x1011A0FAL, 0x14D0BD4DL, 0x19939B94L, 0x1D528623L,
98 0xF12F560EL, 0xF5EE4BB9L, 0xF8AD6D60L, 0xFC6C70D7L,
99 0xE22B20D2L, 0xE6EA3D65L, 0xEBA91BBCL, 0xEF68060BL,
100 0xD727BBB6L, 0xD3E6A601L, 0xDEA580D8L, 0xDA649D6FL,
101 0xC423CD6AL, 0xC0E2D0DDL, 0xCDA1F604L, 0xC960EBB3L,
102 0xBD3E8D7EL, 0xB9FF90C9L, 0xB4BCB610L, 0xB07DABA7L,
103 0xAE3AFBA2L, 0xAAFBE615L, 0xA7B8C0CCL, 0xA379DD7BL,
104 0x9B3660C6L, 0x9FF77D71L, 0x92B45BA8L, 0x9675461FL,
105 0x8832161AL, 0x8CF30BADL, 0x81B02D74L, 0x857130C3L,
106 0x5D8A9099L, 0x594B8D2EL, 0x5408ABF7L, 0x50C9B640L,
107 0x4E8EE645L, 0x4A4FFBF2L, 0x470CDD2BL, 0x43CDC09CL,
108 0x7B827D21L, 0x7F436096L, 0x7200464FL, 0x76C15BF8L,
109 0x68860BFDL, 0x6C47164AL, 0x61043093L, 0x65C52D24L,
110 0x119B4BE9L, 0x155A565EL, 0x18197087L, 0x1CD86D30L,
111 0x029F3D35L, 0x065E2082L, 0x0B1D065BL, 0x0FDC1BECL,
112 0x3793A651L, 0x3352BBE6L, 0x3E119D3FL, 0x3AD08088L,
113 0x2497D08DL, 0x2056CD3AL, 0x2D15EBE3L, 0x29D4F654L,
114 0xC5A92679L, 0xC1683BCEL, 0xCC2B1D17L, 0xC8EA00A0L,
115 0xD6AD50A5L, 0xD26C4D12L, 0xDF2F6BCBL, 0xDBEE767CL,
116 0xE3A1CBC1L, 0xE760D676L, 0xEA23F0AFL, 0xEEE2ED18L,
117 0xF0A5BD1DL, 0xF464A0AAL, 0xF9278673L, 0xFDE69BC4L,
118 0x89B8FD09L, 0x8D79E0BEL, 0x803AC667L, 0x84FBDBD0L,
119 0x9ABC8BD5L, 0x9E7D9662L, 0x933EB0BBL, 0x97FFAD0CL,
120 0xAFB010B1L, 0xAB710D06L, 0xA6322BDFL, 0xA2F33668L,
121 0xBCB4666DL, 0xB8757BDAL, 0xB5365D03L, 0xB1F740B4L
122 };
123 
124 /*****************************************************************/
125 /* End of CRC Lookup Table */
126 /*****************************************************************/
127 
128 /* Calculate CRC-32 Checksum
129 
130  Uses reflected table driven method documented by Ross Williams.
131 
132  PARAMETERS:
133  unsigned char *p Buffer containing data over which
134  to calculate the CRC
135  unsigned long len Length of data in the buffer
136 
137  RETURNS:
138  checksum value
139 
140  Author:
141  Eric Durbin 1998-10-14
142 
143  Modified by:
144  Philips 3D Solutions 2007-10-11
145 
146  Status:
147  Public Domain
148 */
149 
150 unsigned long CalcCRC32(unsigned char *p, unsigned long len)
151 {
152  unsigned long i;
153  unsigned int crc = 0;
154 
155  /* process each byte prior to checksum field */
156  for (i = 0; i < len; i++)
157  {
158  crc = crctable[(crc >> 24) ^ *p++] ^ (crc << 8);
159  }
160 
161  return crc;
162 }