comparison spandsp-0.0.6pre17/src/crc.c @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
comparison
equal deleted inserted replaced
3:c6c5a16ce2f2 4:26cd8f1ef0b1
1 /*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * crc.c
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Copyright (C) 2003 Steve Underwood
9 *
10 * All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 2.1,
14 * as published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *
25 * $Id: crc.c,v 1.6 2009/02/03 16:28:39 steveu Exp $
26 */
27
28 /*! \file */
29
30 #if defined(HAVE_CONFIG_H)
31 #include "config.h"
32 #endif
33
34 #include <inttypes.h>
35 #include <stdio.h>
36 #include <string.h>
37
38 #include "spandsp/telephony.h"
39 #include "spandsp/crc.h"
40 #include "spandsp/bit_operations.h"
41
42 static const uint32_t crc_itu32_table[] =
43 {
44 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
45 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
46 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
47 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
48 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
49 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
50 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
51 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
52 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
53 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
54 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
55 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
56 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
57 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
58 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
59 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
60 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
61 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
62 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
63 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
64 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
65 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
66 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
67 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
68 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
69 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
70 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
71 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
72 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
73 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
74 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
75 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
76 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
77 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
78 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
79 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
80 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
81 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
82 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
83 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
84 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
85 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
86 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
87 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
88 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
89 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
90 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
91 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
92 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
93 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
94 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
95 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
96 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
97 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
98 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
99 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
100 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
101 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
102 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
103 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
104 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
105 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
106 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
107 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
108 };
109
110 SPAN_DECLARE(uint32_t) crc_itu32_calc(const uint8_t *buf, int len, uint32_t crc)
111 {
112 int i;
113
114 for (i = 0; i < len; i++)
115 crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_itu32_table[(crc ^ buf[i]) & 0xFF];
116 return crc;
117 }
118 /*- End of function --------------------------------------------------------*/
119
120 SPAN_DECLARE(int) crc_itu32_append(uint8_t *buf, int len)
121 {
122 uint32_t crc;
123 int new_len;
124 int i;
125
126 crc = 0xFFFFFFFF;
127 new_len = len + 4;
128 for (i = 0; i < len; i++)
129 crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_itu32_table[(crc ^ buf[i]) & 0xFF];
130 crc ^= 0xFFFFFFFF;
131 buf[i++] = (uint8_t) crc;
132 buf[i++] = (uint8_t) (crc >> 8);
133 buf[i++] = (uint8_t) (crc >> 16);
134 buf[i++] = (uint8_t) (crc >> 24);
135 return new_len;
136 }
137 /*- End of function --------------------------------------------------------*/
138
139 SPAN_DECLARE(int) crc_itu32_check(const uint8_t *buf, int len)
140 {
141 uint32_t crc;
142 int i;
143
144 crc = 0xFFFFFFFF;
145 for (i = 0; i < len; i++)
146 crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_itu32_table[(crc ^ buf[i]) & 0xFF];
147 return (crc == 0xDEBB20E3);
148 }
149 /*- End of function --------------------------------------------------------*/
150
151 static const uint16_t crc_itu16_table[] =
152 {
153 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
154 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
155 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
156 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
157 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
158 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
159 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
160 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
161 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
162 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
163 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
164 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
165 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
166 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
167 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
168 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
169 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
170 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
171 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
172 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
173 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
174 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
175 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
176 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
177 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
178 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
179 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
180 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
181 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
182 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
183 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
184 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
185 };
186
187 SPAN_DECLARE(uint16_t) crc_itu16_calc(const uint8_t *buf, int len, uint16_t crc)
188 {
189 int i;
190
191 for (i = 0; i < len; i++)
192 crc = (crc >> 8) ^ crc_itu16_table[(crc ^ buf[i]) & 0xFF];
193 return crc;
194 }
195 /*- End of function --------------------------------------------------------*/
196
197 SPAN_DECLARE(int) crc_itu16_append(uint8_t *buf, int len)
198 {
199 uint16_t crc;
200 int new_len;
201 int i;
202
203 crc = 0xFFFF;
204 new_len = len + 2;
205 for (i = 0; i < len; i++)
206 crc = (crc >> 8) ^ crc_itu16_table[(crc ^ buf[i]) & 0xFF];
207 crc ^= 0xFFFF;
208 buf[i++] = (uint8_t) crc;
209 buf[i++] = (uint8_t) (crc >> 8);
210 return new_len;
211 }
212 /*- End of function --------------------------------------------------------*/
213
214 SPAN_DECLARE(int) crc_itu16_check(const uint8_t *buf, int len)
215 {
216 uint16_t crc;
217 int i;
218
219 crc = 0xFFFF;
220 for (i = 0; i < len; i++)
221 crc = (crc >> 8) ^ crc_itu16_table[(crc ^ buf[i]) & 0xFF];
222 return (crc & 0xFFFF) == 0xF0B8;
223 }
224 /*- End of function --------------------------------------------------------*/
225 /*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.