摘自

https://blog.csdn.net/cp1300/article/details/51443350

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

[jnhs]全套CRC校验 算法的更多相关文章

  1. CRC校验算法学习

    原文:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 本文根据上述链接原文翻译而来,如有错误,忘广大网友互相帮忙纠正,谢谢! 1.前言: 1.0 ...

  2. CRC校验算法的实例解析

    概念   CRC校验算法,说白了,就是把需要校验的数据与多项式进行循环异或(XOR), 进行XOR的方式与实际中数据传输时,是高位先传.还是低位先传有关.对于数据 高位先传的方式,XOR从数据的高位开 ...

  3. CRC校验算法详解

    CRC(Cyclic Redundancy Check)循环冗余校验是常用的数据校验方法,讲CRC算法的文章很多,之所以还要写这篇,是想换一个方法介绍CRC算法,希望能让大家更容易理解CRC算法. 先 ...

  4. CRC校验算法

    typedef unsigned char UCHAR;typedef unsigned char BOOL; /* 计算cnt字节数据的crc,最后一个字节的低7比特必须是0,实际上求的是(cnt× ...

  5. 数据帧CRC32校验算法实现

    本文设计思想采用明德扬至简设计法.由于本人项目需要进行光纤数据传输,为了保证通信质量要对数据进行校验.在校验算法中,最简单最成熟的非CRC校验莫属了. 得出一个数的CRC校验码还是比较简单的: 选定一 ...

  6. [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

    1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...

  7. Java CRC16 MODBUS校验算法实现

    /** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...

  8. 常用校验算法CRC、MD5、SHA_转

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  9. 文档:网络通讯包结构(crc校验,加解密)

    一直想把这个流程整理一下. 包结构: 包 对(datacrc+protoID+dataSize)组成的byte[] 进行crc计算而得到 对(数据内容)进行crc计算而得到 协议号 数据内容的字节长度 ...

随机推荐

  1. HTML - head标签相关

    <html> <!-- head标签中主要配置浏览器的配置信息 --> <head> <!-- 网页标题标签, 用来指定网页的标题 --> <ti ...

  2. Android之RelativeLayout相对布局

    1.相关术语解释 1.基本属性 gravity :设置容器内组件的对齐方式 ignoreGravity : 设置该属性为true的组件,将不受gravity属性的影响 2.根据父容器定位 layout ...

  3. 表单修饰符.lazy.number.trim

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...

  4. python基础数据类型初始,用户交互

    一.基础数据类型初始 1.数字:int  1,2,3 print(100,type(100)) ',type('100')) 查看数据类型的方法:type()函数 取值范围: int(整型) 在32位 ...

  5. ps命令详解-转

    名称:ps使用权限:所有使用者使用方式:ps [options] [--help]说明:显示瞬间行程 (process) 的动态参数:ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义-A   ...

  6. Java超简明入门学习笔记(三)

    Java编程思想第4版学习笔记(三) 第五章 初始化与清理(构造器和垃圾回收机制)         Java有和C++类似的构造函数来为新创建的对象执行初始化及完成一些特殊的操作,有的类数据成员可能会 ...

  7. PostgreSQL DISTINCT ON

    https://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group select DISTINCT ...

  8. HBase Master-status

  9. CodeChef TRIPS-Children Trips 树上分块

    参考文献国家集训队2015论文<浅谈分块在一类在线问题的应用>-邹逍遥 题目链接 题目大意 一棵n个节点的树,树的每条边长度为1或2,每次询问x,y,z. 要求输出从x开始走,每次只能走到 ...

  10. Python-流程控制 if判断

    目录 if 判断 语法 单分支结构 双分支结构 多分支结构 for循环 语法 for + break for + continue for + else range函数 for + if 练习 if ...