├── README.md ├── bin └── Debug │ └── project.exe ├── crcLib.c ├── crcLib.h ├── main.c ├── obj └── Debug │ ├── crcLib.o │ └── main.o ├── project.bmarks ├── project.cbp ├── project.depend └── project.layout /README.md: -------------------------------------------------------------------------------- 1 | # crc-lib-c 2 | 基于C语言的CRC校验库,包括常用的21个CRC参数模型实现 3 | 4 | #### 常用的CRC参数模型 5 | 6 | | CRC算法名称 | 多项式公式 | WIDTH | POLY | INIT | XOROUT | REFIN | REFOUT | 7 | | ------------------ | ------------------------------------------------------------ | ----- | -------- | -------- | -------- | ----- | ------ | 8 | | CRC-4/ITU | x4 + x + 1 | 4 | 03 | 00 | 00 | TRUE | TRUE | 9 | | CRC-5/EPC | x5 + x3 + 1 | 5 | 09 | 09 | 00 | FALSE | FALSE | 10 | | CRC-5/ITU | x5 + x4 + x2 + 1 | 5 | 15 | 00 | 00 | TRUE | TRUE | 11 | | CRC-5/USB | x5 + x2 + 1 | 5 | 05 | 1F | 1F | TRUE | TRUE | 12 | | CRC-6/ITU | x6 + x + 1 | 6 | 03 | 00 | 00 | TRUE | TRUE | 13 | | CRC-7/MMC | x7 + x3 + 1 | 7 | 09 | 00 | 00 | FALSE | FALSE | 14 | | CRC-8 | x8 + x2 + x + 1 | 8 | 07 | 00 | 00 | FALSE | FALSE | 15 | | CRC-8/ITU | x8 + x2 + x + 1 | 8 | 07 | 00 | 55 | FALSE | FALSE | 16 | | CRC-8/ROHC | x8 + x2 + x + 1 | 8 | 07 | FF | 00 | TRUE | TRUE | 17 | | CRC-8/MAXIM | x8 + x5 + x4 + 1 | 8 | 31 | 00 | 00 | TRUE | TRUE | 18 | | CRC-16/IBM | x16 + x15 + x2 + 1 | 16 | 8005 | 0000 | 0000 | TRUE | TRUE | 19 | | CRC-16/MAXIM | x16 + x15 + x2 + 1 | 16 | 8005 | 0000 | FFFF | TRUE | TRUE | 20 | | CRC-16/USB | x16 + x15 + x2 + 1 | 16 | 8005 | FFFF | FFFF | TRUE | TRUE | 21 | | CRC-16/MODBUS | x16 + x15 + x2 + 1 | 16 | 8005 | FFFF | 0000 | TRUE | TRUE | 22 | | CRC-16/CCITT | x16 + x12 + x5 + 1 | 16 | 1021 | 0000 | 0000 | TRUE | TRUE | 23 | | CRC-16/CCITT-FALSE | x16 + x12 + x5 + 1 | 16 | 1021 | FFFF | 0000 | FALSE | FALSE | 24 | | CRC-16/X25 | x16 + x12 + x5 + 1 | 16 | 1021 | FFFF | FFFF | TRUE | TRUE | 25 | | CRC-16/XMODEM | x16 + x12 + x5 + 1 | 16 | 1021 | 0000 | 0000 | FALSE | FALSE | 26 | | CRC-16/DNP | x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1 | 16 | 3D65 | 0000 | FFFF | TRUE | TRUE | 27 | | CRC-32 | x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 | 32 | 04C11DB7 | FFFFFFFF | FFFFFFFF | TRUE | TRUE | 28 | | CRC-32/MPEG-2 | x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 | 32 | 04C11DB7 | FFFFFFFF | 0 | FALSE | FALSE | 29 | 30 | #### CRC计算工具 31 | 32 | 在线计算工具:www.ip33.com/crc.html 33 | 34 | 离线计算工具: 35 | 36 | - CRC_Calc v0.1:http://xz.w10a.com/Small/CRCJISUANQI.zip 37 | - 格西CRC计算器:http://www.geshe.com/home/products/GToolbox/bin/GCRC.exe -------------------------------------------------------------------------------- /bin/Debug/project.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whik/crc-lib-c/abe136aef0b859c4b13d6ba09ad509407b139a25/bin/Debug/project.exe -------------------------------------------------------------------------------- /crcLib.c: -------------------------------------------------------------------------------- 1 | #include "crcLib.h" 2 | 3 | /****************************************************************************** 4 | * Name: CRC-4/ITU x4+x+1 5 | * Poly: 0x03 6 | * Init: 0x00 7 | * Refin: True 8 | * Refout: True 9 | * Xorout: 0x00 10 | * Note: 11 | *****************************************************************************/ 12 | uint8_t crc4_itu(uint8_t *data, uint16_t length) 13 | { 14 | uint8_t i; 15 | uint8_t crc = 0; // Initial value 16 | while(length--) 17 | { 18 | crc ^= *data++; // crc ^= *data; data++; 19 | for (i = 0; i < 8; ++i) 20 | { 21 | if (crc & 1) 22 | crc = (crc >> 1) ^ 0x0C;// 0x0C = (reverse 0x03)>>(8-4) 23 | else 24 | crc = (crc >> 1); 25 | } 26 | } 27 | return crc; 28 | } 29 | 30 | /****************************************************************************** 31 | * Name: CRC-5/EPC x5+x3+1 32 | * Poly: 0x09 33 | * Init: 0x09 34 | * Refin: False 35 | * Refout: False 36 | * Xorout: 0x00 37 | * Note: 38 | *****************************************************************************/ 39 | uint8_t crc5_epc(uint8_t *data, uint16_t length) 40 | { 41 | uint8_t i; 42 | uint8_t crc = 0x48; // Initial value: 0x48 = 0x09<<(8-5) 43 | while(length--) 44 | { 45 | crc ^= *data++; // crc ^= *data; data++; 46 | for ( i = 0; i < 8; i++ ) 47 | { 48 | if ( crc & 0x80 ) 49 | crc = (crc << 1) ^ 0x48; // 0x48 = 0x09<<(8-5) 50 | else 51 | crc <<= 1; 52 | } 53 | } 54 | return crc >> 3; 55 | } 56 | 57 | /****************************************************************************** 58 | * Name: CRC-5/ITU x5+x4+x2+1 59 | * Poly: 0x15 60 | * Init: 0x00 61 | * Refin: True 62 | * Refout: True 63 | * Xorout: 0x00 64 | * Note: 65 | *****************************************************************************/ 66 | uint8_t crc5_itu(uint8_t *data, uint16_t length) 67 | { 68 | uint8_t i; 69 | uint8_t crc = 0; // Initial value 70 | while(length--) 71 | { 72 | crc ^= *data++; // crc ^= *data; data++; 73 | for (i = 0; i < 8; ++i) 74 | { 75 | if (crc & 1) 76 | crc = (crc >> 1) ^ 0x15;// 0x15 = (reverse 0x15)>>(8-5) 77 | else 78 | crc = (crc >> 1); 79 | } 80 | } 81 | return crc; 82 | } 83 | 84 | /****************************************************************************** 85 | * Name: CRC-5/USB x5+x2+1 86 | * Poly: 0x05 87 | * Init: 0x1F 88 | * Refin: True 89 | * Refout: True 90 | * Xorout: 0x1F 91 | * Note: 92 | *****************************************************************************/ 93 | uint8_t crc5_usb(uint8_t *data, uint16_t length) 94 | { 95 | uint8_t i; 96 | uint8_t crc = 0x1F; // Initial value 97 | while(length--) 98 | { 99 | crc ^= *data++; // crc ^= *data; data++; 100 | for (i = 0; i < 8; ++i) 101 | { 102 | if (crc & 1) 103 | crc = (crc >> 1) ^ 0x14;// 0x14 = (reverse 0x05)>>(8-5) 104 | else 105 | crc = (crc >> 1); 106 | } 107 | } 108 | return crc ^ 0x1F; 109 | } 110 | 111 | /****************************************************************************** 112 | * Name: CRC-6/ITU x6+x+1 113 | * Poly: 0x03 114 | * Init: 0x00 115 | * Refin: True 116 | * Refout: True 117 | * Xorout: 0x00 118 | * Note: 119 | *****************************************************************************/ 120 | uint8_t crc6_itu(uint8_t *data, uint16_t length) 121 | { 122 | uint8_t i; 123 | uint8_t crc = 0; // Initial value 124 | while(length--) 125 | { 126 | crc ^= *data++; // crc ^= *data; data++; 127 | for (i = 0; i < 8; ++i) 128 | { 129 | if (crc & 1) 130 | crc = (crc >> 1) ^ 0x30;// 0x30 = (reverse 0x03)>>(8-6) 131 | else 132 | crc = (crc >> 1); 133 | } 134 | } 135 | return crc; 136 | } 137 | 138 | /****************************************************************************** 139 | * Name: CRC-7/MMC x7+x3+1 140 | * Poly: 0x09 141 | * Init: 0x00 142 | * Refin: False 143 | * Refout: False 144 | * Xorout: 0x00 145 | * Use: MultiMediaCard,SD,ect. 146 | *****************************************************************************/ 147 | uint8_t crc7_mmc(uint8_t *data, uint16_t length) 148 | { 149 | uint8_t i; 150 | uint8_t crc = 0; // Initial value 151 | while(length--) 152 | { 153 | crc ^= *data++; // crc ^= *data; data++; 154 | for ( i = 0; i < 8; i++ ) 155 | { 156 | if ( crc & 0x80 ) 157 | crc = (crc << 1) ^ 0x12; // 0x12 = 0x09<<(8-7) 158 | else 159 | crc <<= 1; 160 | } 161 | } 162 | return crc >> 1; 163 | } 164 | 165 | /****************************************************************************** 166 | * Name: CRC-8 x8+x2+x+1 167 | * Poly: 0x07 168 | * Init: 0x00 169 | * Refin: False 170 | * Refout: False 171 | * Xorout: 0x00 172 | * Note: 173 | *****************************************************************************/ 174 | uint8_t crc8(uint8_t *data, uint16_t length) 175 | { 176 | uint8_t i; 177 | uint8_t crc = 0; // Initial value 178 | while(length--) 179 | { 180 | crc ^= *data++; // crc ^= *data; data++; 181 | for ( i = 0; i < 8; i++ ) 182 | { 183 | if ( crc & 0x80 ) 184 | crc = (crc << 1) ^ 0x07; 185 | else 186 | crc <<= 1; 187 | } 188 | } 189 | return crc; 190 | } 191 | 192 | /****************************************************************************** 193 | * Name: CRC-8/ITU x8+x2+x+1 194 | * Poly: 0x07 195 | * Init: 0x00 196 | * Refin: False 197 | * Refout: False 198 | * Xorout: 0x55 199 | * Alias: CRC-8/ATM 200 | *****************************************************************************/ 201 | uint8_t crc8_itu(uint8_t *data, uint16_t length) 202 | { 203 | uint8_t i; 204 | uint8_t crc = 0; // Initial value 205 | while(length--) 206 | { 207 | crc ^= *data++; // crc ^= *data; data++; 208 | for ( i = 0; i < 8; i++ ) 209 | { 210 | if ( crc & 0x80 ) 211 | crc = (crc << 1) ^ 0x07; 212 | else 213 | crc <<= 1; 214 | } 215 | } 216 | return crc ^ 0x55; 217 | } 218 | 219 | /****************************************************************************** 220 | * Name: CRC-8/ROHC x8+x2+x+1 221 | * Poly: 0x07 222 | * Init: 0xFF 223 | * Refin: True 224 | * Refout: True 225 | * Xorout: 0x00 226 | * Note: 227 | *****************************************************************************/ 228 | uint8_t crc8_rohc(uint8_t *data, uint16_t length) 229 | { 230 | uint8_t i; 231 | uint8_t crc = 0xFF; // Initial value 232 | while(length--) 233 | { 234 | crc ^= *data++; // crc ^= *data; data++; 235 | for (i = 0; i < 8; ++i) 236 | { 237 | if (crc & 1) 238 | crc = (crc >> 1) ^ 0xE0; // 0xE0 = reverse 0x07 239 | else 240 | crc = (crc >> 1); 241 | } 242 | } 243 | return crc; 244 | } 245 | 246 | /****************************************************************************** 247 | * Name: CRC-8/MAXIM x8+x5+x4+1 248 | * Poly: 0x31 249 | * Init: 0x00 250 | * Refin: True 251 | * Refout: True 252 | * Xorout: 0x00 253 | * Alias: DOW-CRC,CRC-8/IBUTTON 254 | * Use: Maxim(Dallas)'s some devices,e.g. DS18B20 255 | *****************************************************************************/ 256 | uint8_t crc8_maxim(uint8_t *data, uint16_t length) 257 | { 258 | uint8_t i; 259 | uint8_t crc = 0; // Initial value 260 | while(length--) 261 | { 262 | crc ^= *data++; // crc ^= *data; data++; 263 | for (i = 0; i < 8; i++) 264 | { 265 | if (crc & 1) 266 | crc = (crc >> 1) ^ 0x8C; // 0x8C = reverse 0x31 267 | else 268 | crc >>= 1; 269 | } 270 | } 271 | return crc; 272 | } 273 | 274 | /****************************************************************************** 275 | * Name: CRC-16/IBM x16+x15+x2+1 276 | * Poly: 0x8005 277 | * Init: 0x0000 278 | * Refin: True 279 | * Refout: True 280 | * Xorout: 0x0000 281 | * Alias: CRC-16,CRC-16/ARC,CRC-16/LHA 282 | *****************************************************************************/ 283 | uint16_t crc16_ibm(uint8_t *data, uint16_t length) 284 | { 285 | uint8_t i; 286 | uint16_t crc = 0; // Initial value 287 | while(length--) 288 | { 289 | crc ^= *data++; // crc ^= *data; data++; 290 | for (i = 0; i < 8; ++i) 291 | { 292 | if (crc & 1) 293 | crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005 294 | else 295 | crc = (crc >> 1); 296 | } 297 | } 298 | return crc; 299 | } 300 | 301 | /****************************************************************************** 302 | * Name: CRC-16/MAXIM x16+x15+x2+1 303 | * Poly: 0x8005 304 | * Init: 0x0000 305 | * Refin: True 306 | * Refout: True 307 | * Xorout: 0xFFFF 308 | * Note: 309 | *****************************************************************************/ 310 | uint16_t crc16_maxim(uint8_t *data, uint16_t length) 311 | { 312 | uint8_t i; 313 | uint16_t crc = 0; // Initial value 314 | while(length--) 315 | { 316 | crc ^= *data++; // crc ^= *data; data++; 317 | for (i = 0; i < 8; ++i) 318 | { 319 | if (crc & 1) 320 | crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005 321 | else 322 | crc = (crc >> 1); 323 | } 324 | } 325 | return ~crc; // crc^0xffff 326 | } 327 | 328 | /****************************************************************************** 329 | * Name: CRC-16/USB x16+x15+x2+1 330 | * Poly: 0x8005 331 | * Init: 0xFFFF 332 | * Refin: True 333 | * Refout: True 334 | * Xorout: 0xFFFF 335 | * Note: 336 | *****************************************************************************/ 337 | uint16_t crc16_usb(uint8_t *data, uint16_t length) 338 | { 339 | uint8_t i; 340 | uint16_t crc = 0xffff; // Initial value 341 | while(length--) 342 | { 343 | crc ^= *data++; // crc ^= *data; data++; 344 | for (i = 0; i < 8; ++i) 345 | { 346 | if (crc & 1) 347 | crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005 348 | else 349 | crc = (crc >> 1); 350 | } 351 | } 352 | return ~crc; // crc^0xffff 353 | } 354 | 355 | /****************************************************************************** 356 | * Name: CRC-16/MODBUS x16+x15+x2+1 357 | * Poly: 0x8005 358 | * Init: 0xFFFF 359 | * Refin: True 360 | * Refout: True 361 | * Xorout: 0x0000 362 | * Note: 363 | *****************************************************************************/ 364 | uint16_t crc16_modbus(uint8_t *data, uint16_t length) 365 | { 366 | uint8_t i; 367 | uint16_t crc = 0xffff; // Initial value 368 | while(length--) 369 | { 370 | crc ^= *data++; // crc ^= *data; data++; 371 | for (i = 0; i < 8; ++i) 372 | { 373 | if (crc & 1) 374 | crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005 375 | else 376 | crc = (crc >> 1); 377 | } 378 | } 379 | return crc; 380 | } 381 | 382 | /****************************************************************************** 383 | * Name: CRC-16/CCITT x16+x12+x5+1 384 | * Poly: 0x1021 385 | * Init: 0x0000 386 | * Refin: True 387 | * Refout: True 388 | * Xorout: 0x0000 389 | * Alias: CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT 390 | *****************************************************************************/ 391 | uint16_t crc16_ccitt(uint8_t *data, uint16_t length) 392 | { 393 | uint8_t i; 394 | uint16_t crc = 0; // Initial value 395 | while(length--) 396 | { 397 | crc ^= *data++; // crc ^= *data; data++; 398 | for (i = 0; i < 8; ++i) 399 | { 400 | if (crc & 1) 401 | crc = (crc >> 1) ^ 0x8408; // 0x8408 = reverse 0x1021 402 | else 403 | crc = (crc >> 1); 404 | } 405 | } 406 | return crc; 407 | } 408 | 409 | /****************************************************************************** 410 | * Name: CRC-16/CCITT-FALSE x16+x12+x5+1 411 | * Poly: 0x1021 412 | * Init: 0xFFFF 413 | * Refin: False 414 | * Refout: False 415 | * Xorout: 0x0000 416 | * Note: 417 | *****************************************************************************/ 418 | uint16_t crc16_ccitt_false(uint8_t *data, uint16_t length) 419 | { 420 | uint8_t i; 421 | uint16_t crc = 0xffff; //Initial value 422 | while(length--) 423 | { 424 | crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint6_t)(*data)<<8; data++; 425 | for (i = 0; i < 8; ++i) 426 | { 427 | if ( crc & 0x8000 ) 428 | crc = (crc << 1) ^ 0x1021; 429 | else 430 | crc <<= 1; 431 | } 432 | } 433 | return crc; 434 | } 435 | 436 | /****************************************************************************** 437 | * Name: CRC-16/X25 x16+x12+x5+1 438 | * Poly: 0x1021 439 | * Init: 0xFFFF 440 | * Refin: True 441 | * Refout: True 442 | * Xorout: 0XFFFF 443 | * Note: 444 | *****************************************************************************/ 445 | uint16_t crc16_x25(uint8_t *data, uint16_t length) 446 | { 447 | uint8_t i; 448 | uint16_t crc = 0xffff; // Initial value 449 | while(length--) 450 | { 451 | crc ^= *data++; // crc ^= *data; data++; 452 | for (i = 0; i < 8; ++i) 453 | { 454 | if (crc & 1) 455 | crc = (crc >> 1) ^ 0x8408; // 0x8408 = reverse 0x1021 456 | else 457 | crc = (crc >> 1); 458 | } 459 | } 460 | return ~crc; // crc^Xorout 461 | } 462 | 463 | /****************************************************************************** 464 | * Name: CRC-16/XMODEM x16+x12+x5+1 465 | * Poly: 0x1021 466 | * Init: 0x0000 467 | * Refin: False 468 | * Refout: False 469 | * Xorout: 0x0000 470 | * Alias: CRC-16/ZMODEM,CRC-16/ACORN 471 | *****************************************************************************/ 472 | uint16_t crc16_xmodem(uint8_t *data, uint16_t length) 473 | { 474 | uint8_t i; 475 | uint16_t crc = 0; // Initial value 476 | while(length--) 477 | { 478 | crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++; 479 | for (i = 0; i < 8; ++i) 480 | { 481 | if ( crc & 0x8000 ) 482 | crc = (crc << 1) ^ 0x1021; 483 | else 484 | crc <<= 1; 485 | } 486 | } 487 | return crc; 488 | } 489 | 490 | /****************************************************************************** 491 | * Name: CRC-16/DNP x16+x13+x12+x11+x10+x8+x6+x5+x2+1 492 | * Poly: 0x3D65 493 | * Init: 0x0000 494 | * Refin: True 495 | * Refout: True 496 | * Xorout: 0xFFFF 497 | * Use: M-Bus,ect. 498 | *****************************************************************************/ 499 | uint16_t crc16_dnp(uint8_t *data, uint16_t length) 500 | { 501 | uint8_t i; 502 | uint16_t crc = 0; // Initial value 503 | while(length--) 504 | { 505 | crc ^= *data++; // crc ^= *data; data++; 506 | for (i = 0; i < 8; ++i) 507 | { 508 | if (crc & 1) 509 | crc = (crc >> 1) ^ 0xA6BC; // 0xA6BC = reverse 0x3D65 510 | else 511 | crc = (crc >> 1); 512 | } 513 | } 514 | return ~crc; // crc^Xorout 515 | } 516 | 517 | /****************************************************************************** 518 | * Name: CRC-32 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 519 | * Poly: 0x4C11DB7 520 | * Init: 0xFFFFFFF 521 | * Refin: True 522 | * Refout: True 523 | * Xorout: 0xFFFFFFF 524 | * Alias: CRC_32/ADCCP 525 | * Use: WinRAR,ect. 526 | *****************************************************************************/ 527 | uint32_t crc32(uint8_t *data, uint16_t length) 528 | { 529 | uint8_t i; 530 | uint32_t crc = 0xffffffff; // Initial value 531 | while(length--) 532 | { 533 | crc ^= *data++; // crc ^= *data; data++; 534 | for (i = 0; i < 8; ++i) 535 | { 536 | if (crc & 1) 537 | crc = (crc >> 1) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7 538 | else 539 | crc = (crc >> 1); 540 | } 541 | } 542 | return ~crc; 543 | } 544 | 545 | /****************************************************************************** 546 | * Name: CRC-32/MPEG-2 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 547 | * Poly: 0x4C11DB7 548 | * Init: 0xFFFFFFF 549 | * Refin: False 550 | * Refout: False 551 | * Xorout: 0x0000000 552 | * Note: 553 | *****************************************************************************/ 554 | uint32_t crc32_mpeg_2(uint8_t *data, uint16_t length) 555 | { 556 | uint8_t i; 557 | uint32_t crc = 0xffffffff; // Initial value 558 | while(length--) 559 | { 560 | crc ^= (uint32_t)(*data++) << 24;// crc ^=(uint32_t)(*data)<<24; data++; 561 | for (i = 0; i < 8; ++i) 562 | { 563 | if ( crc & 0x80000000 ) 564 | crc = (crc << 1) ^ 0x04C11DB7; 565 | else 566 | crc <<= 1; 567 | } 568 | } 569 | return crc; 570 | } 571 | -------------------------------------------------------------------------------- /crcLib.h: -------------------------------------------------------------------------------- 1 | #ifndef __CRCLIB_H__ 2 | #define __CRCLIB_H__ 3 | 4 | #include "stdint.h" 5 | 6 | uint8_t crc4_itu(uint8_t *data, uint16_t length); 7 | uint8_t crc5_epc(uint8_t *data, uint16_t length); 8 | uint8_t crc5_itu(uint8_t *data, uint16_t length); 9 | uint8_t crc5_usb(uint8_t *data, uint16_t length); 10 | uint8_t crc6_itu(uint8_t *data, uint16_t length); 11 | uint8_t crc7_mmc(uint8_t *data, uint16_t length); 12 | uint8_t crc8(uint8_t *data, uint16_t length); 13 | uint8_t crc8_itu(uint8_t *data, uint16_t length); 14 | uint8_t crc8_rohc(uint8_t *data, uint16_t length); 15 | uint8_t crc8_maxim(uint8_t *data, uint16_t length);//DS18B20 16 | uint16_t crc16_ibm(uint8_t *data, uint16_t length); 17 | uint16_t crc16_maxim(uint8_t *data, uint16_t length); 18 | uint16_t crc16_usb(uint8_t *data, uint16_t length); 19 | uint16_t crc16_modbus(uint8_t *data, uint16_t length); 20 | uint16_t crc16_ccitt(uint8_t *data, uint16_t length); 21 | uint16_t crc16_ccitt_false(uint8_t *data, uint16_t length); 22 | uint16_t crc16_x25(uint8_t *data, uint16_t length); 23 | uint16_t crc16_xmodem(uint8_t *data, uint16_t length); 24 | uint16_t crc16_dnp(uint8_t *data, uint16_t length); 25 | uint32_t crc32(uint8_t *data, uint16_t length); 26 | uint32_t crc32_mpeg_2(uint8_t *data, uint16_t length); 27 | 28 | 29 | #endif // __CRCLIB_H__ 30 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "crcLib.h" 4 | 5 | int main() 6 | { 7 | uint8_t data; 8 | uint8_t crc; 9 | 10 | data = 0x34; 11 | crc = crc8_maxim(&data, 1); 12 | 13 | printf("data:%02x, crc:%02x\n", data, crc); 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /obj/Debug/crcLib.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whik/crc-lib-c/abe136aef0b859c4b13d6ba09ad509407b139a25/obj/Debug/crcLib.o -------------------------------------------------------------------------------- /obj/Debug/main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whik/crc-lib-c/abe136aef0b859c4b13d6ba09ad509407b139a25/obj/Debug/main.o -------------------------------------------------------------------------------- /project.bmarks: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /project.cbp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 45 | 46 | -------------------------------------------------------------------------------- /project.depend: -------------------------------------------------------------------------------- 1 | # depslib dependency file v1.0 2 | 1600584609 source:d:\myfile\crc-lib-c\crclib.c 3 | "crcLib.h" 4 | 5 | 1600596279 d:\myfile\crc-lib-c\crclib.h 6 | "stdint.h" 7 | 8 | 1600596694 source:d:\myfile\crc-lib-c\main.c 9 | 10 | 11 | "crcLib.h" 12 | 13 | -------------------------------------------------------------------------------- /project.layout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | --------------------------------------------------------------------------------