搜索
bottom↓
回复: 29

[长]CRC全套校验码生成函数源码(非查表)逐位运算法

  [复制链接]

出0入0汤圆

发表于 2015-12-7 23:42:42 | 显示全部楼层 |阅读模式
本帖最后由 e1ki0lp 于 2015-12-7 23:53 编辑

新手,闲的没事写的,所有的crc校验基本就都是一个套路,我这里写了crc-4,5,6,7,8,16,32的校验码生成函数,
64的没怎么见过,没写,不过根据前面的套路,很容易就写出来了.

其实并不是所有的情况都需要讲究速度,比如DS18B20那种器件,就8个字节的寄存器,校验起来很容易的.不需要查表,逐位运算就能满足要求.
逐位运算好处是不用写表了,弱点也很明显,速度慢.

废话不多说,贴代码

  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);
  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 = 0;                // Initial value
  35.     while(length--)
  36.     {
  37.         crc ^= *data++;                 // crc ^= *data; data++;
  38.         for (i = 0; i < 8; ++i)
  39.         {
  40.             if (crc & 1)
  41.                 crc = (crc >> 1) ^ 0x0C;// 0x0C = (reverse 0x03)>>(8-4)
  42.             else
  43.                 crc = (crc >> 1);
  44.         }
  45.     }
  46.     return crc;
  47. }

  48. /******************************************************************************
  49. * Name:    CRC-5/EPC           x5+x3+1
  50. * Poly:    0x09
  51. * Init:    0x09
  52. * Refin:   False
  53. * Refout:  False
  54. * Xorout:  0x00
  55. * Note:
  56. *****************************************************************************/
  57. uint8_t crc5_epc(uint8_t *data, uint_len length)
  58. {
  59.     uint8_t i;
  60.     uint8_t crc = 0x48;        // Initial value: 0x48 = 0x09<<(8-5)
  61.     while(length--)
  62.     {
  63.         crc ^= *data++;        // crc ^= *data; data++;
  64.         for ( i = 0; i < 8; i++ )
  65.         {
  66.             if ( crc & 0x80 )
  67.                 crc = (crc << 1) ^ 0x48;        // 0x48 = 0x09<<(8-5)
  68.             else
  69.                 crc <<= 1;
  70.         }
  71.     }
  72.     return crc >> 3;
  73. }

  74. /******************************************************************************
  75. * Name:    CRC-5/ITU           x5+x4+x2+1
  76. * Poly:    0x15
  77. * Init:    0x00
  78. * Refin:   True
  79. * Refout:  True
  80. * Xorout:  0x00
  81. * Note:
  82. *****************************************************************************/
  83. uint8_t crc5_itu(uint8_t *data, uint_len length)
  84. {
  85.     uint8_t i;
  86.     uint8_t crc = 0;                // Initial value
  87.     while(length--)
  88.     {
  89.         crc ^= *data++;                 // crc ^= *data; data++;
  90.         for (i = 0; i < 8; ++i)
  91.         {
  92.             if (crc & 1)
  93.                 crc = (crc >> 1) ^ 0x15;// 0x15 = (reverse 0x15)>>(8-5)
  94.             else
  95.                 crc = (crc >> 1);
  96.         }
  97.     }
  98.     return crc;
  99. }

  100. /******************************************************************************
  101. * Name:    CRC-5/USB           x5+x2+1
  102. * Poly:    0x05
  103. * Init:    0x1F
  104. * Refin:   True
  105. * Refout:  True
  106. * Xorout:  0x1F
  107. * Note:
  108. *****************************************************************************/
  109. uint8_t crc5_usb(uint8_t *data, uint_len length)
  110. {
  111.     uint8_t i;
  112.     uint8_t crc = 0x1F;                // Initial value
  113.     while(length--)
  114.     {
  115.         crc ^= *data++;                 // crc ^= *data; data++;
  116.         for (i = 0; i < 8; ++i)
  117.         {
  118.             if (crc & 1)
  119.                 crc = (crc >> 1) ^ 0x14;// 0x14 = (reverse 0x05)>>(8-5)
  120.             else
  121.                 crc = (crc >> 1);
  122.         }
  123.     }
  124.     return crc ^ 0x1F;
  125. }

  126. /******************************************************************************
  127. * Name:    CRC-6/ITU           x6+x+1
  128. * Poly:    0x03
  129. * Init:    0x00
  130. * Refin:   True
  131. * Refout:  True
  132. * Xorout:  0x00
  133. * Note:
  134. *****************************************************************************/
  135. uint8_t crc6_itu(uint8_t *data, uint_len length)
  136. {
  137.     uint8_t i;
  138.     uint8_t crc = 0;         // Initial value
  139.     while(length--)
  140.     {
  141.         crc ^= *data++;        // crc ^= *data; data++;
  142.         for (i = 0; i < 8; ++i)
  143.         {
  144.             if (crc & 1)
  145.                 crc = (crc >> 1) ^ 0x30;// 0x30 = (reverse 0x03)>>(8-6)
  146.             else
  147.                 crc = (crc >> 1);
  148.         }
  149.     }
  150.     return crc;
  151. }

  152. /******************************************************************************
  153. * Name:    CRC-7/MMC           x7+x3+1
  154. * Poly:    0x09
  155. * Init:    0x00
  156. * Refin:   False
  157. * Refout:  False
  158. * Xorout:  0x00
  159. * Use:     MultiMediaCard,SD,ect.
  160. *****************************************************************************/
  161. uint8_t crc7_mmc(uint8_t *data, uint_len length)
  162. {
  163.     uint8_t i;
  164.     uint8_t crc = 0;        // Initial value
  165.     while(length--)
  166.     {
  167.         crc ^= *data++;        // crc ^= *data; data++;
  168.         for ( i = 0; i < 8; i++ )
  169.         {
  170.             if ( crc & 0x80 )
  171.                 crc = (crc << 1) ^ 0x12;        // 0x12 = 0x09<<(8-7)
  172.             else
  173.                 crc <<= 1;
  174.         }
  175.     }
  176.     return crc >> 1;
  177. }

  178. /******************************************************************************
  179. * Name:    CRC-8               x8+x2+x+1
  180. * Poly:    0x07
  181. * Init:    0x00
  182. * Refin:   False
  183. * Refout:  False
  184. * Xorout:  0x00
  185. * Note:
  186. *****************************************************************************/
  187. uint8_t crc8(uint8_t *data, uint_len length)
  188. {
  189.     uint8_t i;
  190.     uint8_t crc = 0;        // Initial value
  191.     while(length--)
  192.     {
  193.         crc ^= *data++;        // crc ^= *data; data++;
  194.         for ( i = 0; i < 8; i++ )
  195.         {
  196.             if ( crc & 0x80 )
  197.                 crc = (crc << 1) ^ 0x07;
  198.             else
  199.                 crc <<= 1;
  200.         }
  201.     }
  202.     return crc;
  203. }

  204. /******************************************************************************
  205. * Name:    CRC-8/ITU           x8+x2+x+1
  206. * Poly:    0x07
  207. * Init:    0x00
  208. * Refin:   False
  209. * Refout:  False
  210. * Xorout:  0x55
  211. * Alias:   CRC-8/ATM
  212. *****************************************************************************/
  213. uint8_t crc8_itu(uint8_t *data, uint_len length)
  214. {
  215.     uint8_t i;
  216.     uint8_t crc = 0;        // Initial value
  217.     while(length--)
  218.     {
  219.         crc ^= *data++;        // crc ^= *data; data++;
  220.         for ( i = 0; i < 8; i++ )
  221.         {
  222.             if ( crc & 0x80 )
  223.                 crc = (crc << 1) ^ 0x07;
  224.             else
  225.                 crc <<= 1;
  226.         }
  227.     }
  228.     return crc ^ 0x55;
  229. }

  230. /******************************************************************************
  231. * Name:    CRC-8/ROHC          x8+x2+x+1
  232. * Poly:    0x07
  233. * Init:    0xFF
  234. * Refin:   True
  235. * Refout:  True
  236. * Xorout:  0x00
  237. * Note:
  238. *****************************************************************************/
  239. uint8_t crc8_rohc(uint8_t *data, uint_len length)
  240. {
  241.     uint8_t i;
  242.     uint8_t crc = 0xFF;         // Initial value
  243.     while(length--)
  244.     {
  245.         crc ^= *data++;            // crc ^= *data; data++;
  246.         for (i = 0; i < 8; ++i)
  247.         {
  248.             if (crc & 1)
  249.                 crc = (crc >> 1) ^ 0xE0;        // 0xE0 = reverse 0x07
  250.             else
  251.                 crc = (crc >> 1);
  252.         }
  253.     }
  254.     return crc;
  255. }

  256. /******************************************************************************
  257. * Name:    CRC-8/MAXIM         x8+x5+x4+1
  258. * Poly:    0x31
  259. * Init:    0x00
  260. * Refin:   True
  261. * Refout:  True
  262. * Xorout:  0x00
  263. * Alias:   DOW-CRC,CRC-8/IBUTTON
  264. * Use:     Maxim(Dallas)'s some devices,e.g. DS18B20
  265. *****************************************************************************/
  266. uint8_t crc8_maxim(uint8_t *data, uint_len length)
  267. {
  268.     uint8_t i;
  269.     uint8_t crc = 0;         // Initial value
  270.     while(length--)
  271.     {
  272.         crc ^= *data++;        // crc ^= *data; data++;
  273.         for (i = 0; i < 8; i++)
  274.         {
  275.             if (crc & 1)
  276.                 crc = (crc >> 1) ^ 0x8C;        // 0x8C = reverse 0x31
  277.             else
  278.                 crc >>= 1;
  279.         }
  280.     }
  281.     return crc;
  282. }

  283. /******************************************************************************
  284. * Name:    CRC-16/IBM          x16+x15+x2+1
  285. * Poly:    0x8005
  286. * Init:    0x0000
  287. * Refin:   True
  288. * Refout:  True
  289. * Xorout:  0x0000
  290. * Alias:   CRC-16,CRC-16/ARC,CRC-16/LHA
  291. *****************************************************************************/
  292. uint16_t crc16_ibm(uint8_t *data, uint_len length)
  293. {
  294.     uint8_t i;
  295.     uint16_t crc = 0;        // Initial value
  296.     while(length--)
  297.     {
  298.         crc ^= *data++;        // crc ^= *data; data++;
  299.         for (i = 0; i < 8; ++i)
  300.         {
  301.             if (crc & 1)
  302.                 crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005
  303.             else
  304.                 crc = (crc >> 1);
  305.         }
  306.     }
  307.     return crc;
  308. }

  309. /******************************************************************************
  310. * Name:    CRC-16/MAXIM        x16+x15+x2+1
  311. * Poly:    0x8005
  312. * Init:    0x0000
  313. * Refin:   True
  314. * Refout:  True
  315. * Xorout:  0xFFFF
  316. * Note:
  317. *****************************************************************************/
  318. uint16_t crc16_maxim(uint8_t *data, uint_len length)
  319. {
  320.     uint8_t i;
  321.     uint16_t crc = 0;        // Initial value
  322.     while(length--)
  323.     {
  324.         crc ^= *data++;        // crc ^= *data; data++;
  325.         for (i = 0; i < 8; ++i)
  326.         {
  327.             if (crc & 1)
  328.                 crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005
  329.             else
  330.                 crc = (crc >> 1);
  331.         }
  332.     }
  333.     return ~crc;    // crc^0xffff
  334. }

  335. /******************************************************************************
  336. * Name:    CRC-16/USB          x16+x15+x2+1
  337. * Poly:    0x8005
  338. * Init:    0xFFFF
  339. * Refin:   True
  340. * Refout:  True
  341. * Xorout:  0xFFFF
  342. * Note:
  343. *****************************************************************************/
  344. uint16_t crc16_usb(uint8_t *data, uint_len length)
  345. {
  346.     uint8_t i;
  347.     uint16_t crc = 0xffff;        // Initial value
  348.     while(length--)
  349.     {
  350.         crc ^= *data++;            // crc ^= *data; data++;
  351.         for (i = 0; i < 8; ++i)
  352.         {
  353.             if (crc & 1)
  354.                 crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005
  355.             else
  356.                 crc = (crc >> 1);
  357.         }
  358.     }
  359.     return ~crc;    // crc^0xffff
  360. }

  361. /******************************************************************************
  362. * Name:    CRC-16/MODBUS       x16+x15+x2+1
  363. * Poly:    0x8005
  364. * Init:    0xFFFF
  365. * Refin:   True
  366. * Refout:  True
  367. * Xorout:  0x0000
  368. * Note:
  369. *****************************************************************************/
  370. uint16_t crc16_modbus(uint8_t *data, uint_len length)
  371. {
  372.     uint8_t i;
  373.     uint16_t crc = 0xffff;        // Initial value
  374.     while(length--)
  375.     {
  376.         crc ^= *data++;            // crc ^= *data; data++;
  377.         for (i = 0; i < 8; ++i)
  378.         {
  379.             if (crc & 1)
  380.                 crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005
  381.             else
  382.                 crc = (crc >> 1);
  383.         }
  384.     }
  385.     return crc;
  386. }

  387. /******************************************************************************
  388. * Name:    CRC-16/CCITT        x16+x12+x5+1
  389. * Poly:    0x1021
  390. * Init:    0x0000
  391. * Refin:   True
  392. * Refout:  True
  393. * Xorout:  0x0000
  394. * Alias:   CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT
  395. *****************************************************************************/
  396. uint16_t crc16_ccitt(uint8_t *data, uint_len length)
  397. {
  398.     uint8_t i;
  399.     uint16_t crc = 0;        // Initial value
  400.     while(length--)
  401.     {
  402.         crc ^= *data++;        // crc ^= *data; data++;
  403.         for (i = 0; i < 8; ++i)
  404.         {
  405.             if (crc & 1)
  406.                 crc = (crc >> 1) ^ 0x8408;        // 0x8408 = reverse 0x1021
  407.             else
  408.                 crc = (crc >> 1);
  409.         }
  410.     }
  411.     return crc;
  412. }

  413. /******************************************************************************
  414. * Name:    CRC-16/CCITT-FALSE   x16+x12+x5+1
  415. * Poly:    0x1021
  416. * Init:    0xFFFF
  417. * Refin:   False
  418. * Refout:  False
  419. * Xorout:  0x0000
  420. * Note:
  421. *****************************************************************************/
  422. uint16_t crc16_ccitt_false(uint8_t *data, uint_len length)
  423. {
  424.     uint8_t i;
  425.     uint16_t crc = 0xffff;        //Initial value
  426.     while(length--)
  427.     {
  428.         crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint6_t)(*data)<<8; data++;
  429.         for (i = 0; i < 8; ++i)
  430.         {
  431.             if ( crc & 0x8000 )
  432.                 crc = (crc << 1) ^ 0x1021;
  433.             else
  434.                 crc <<= 1;
  435.         }
  436.     }
  437.     return crc;
  438. }

  439. /******************************************************************************
  440. * Name:    CRC-16/X25          x16+x12+x5+1
  441. * Poly:    0x1021
  442. * Init:    0xFFFF
  443. * Refin:   True
  444. * Refout:  True
  445. * Xorout:  0XFFFF
  446. * Note:
  447. *****************************************************************************/
  448. uint16_t crc16_x25(uint8_t *data, uint_len length)
  449. {
  450.     uint8_t i;
  451.     uint16_t crc = 0xffff;        // Initial value
  452.     while(length--)
  453.     {
  454.         crc ^= *data++;            // crc ^= *data; data++;
  455.         for (i = 0; i < 8; ++i)
  456.         {
  457.             if (crc & 1)
  458.                 crc = (crc >> 1) ^ 0x8408;        // 0x8408 = reverse 0x1021
  459.             else
  460.                 crc = (crc >> 1);
  461.         }
  462.     }
  463.     return ~crc;                // crc^Xorout
  464. }

  465. /******************************************************************************
  466. * Name:    CRC-16/XMODEM       x16+x12+x5+1
  467. * Poly:    0x1021
  468. * Init:    0x0000
  469. * Refin:   False
  470. * Refout:  False
  471. * Xorout:  0x0000
  472. * Alias:   CRC-16/ZMODEM,CRC-16/ACORN
  473. *****************************************************************************/
  474. uint16_t crc16_xmodem(uint8_t *data, uint_len length)
  475. {
  476.     uint8_t i;
  477.     uint16_t crc = 0;            // Initial value
  478.     while(length--)
  479.     {
  480.         crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++;
  481.         for (i = 0; i < 8; ++i)
  482.         {
  483.             if ( crc & 0x8000 )
  484.                 crc = (crc << 1) ^ 0x1021;
  485.             else
  486.                 crc <<= 1;
  487.         }
  488.     }
  489.     return crc;
  490. }

  491. /******************************************************************************
  492. * Name:    CRC-16/DNP          x16+x13+x12+x11+x10+x8+x6+x5+x2+1
  493. * Poly:    0x3D65
  494. * Init:    0x0000
  495. * Refin:   True
  496. * Refout:  True
  497. * Xorout:  0xFFFF
  498. * Use:     M-Bus,ect.
  499. *****************************************************************************/
  500. uint16_t crc16_dnp(uint8_t *data, uint_len length)
  501. {
  502.     uint8_t i;
  503.     uint16_t crc = 0;            // Initial value
  504.     while(length--)
  505.     {
  506.         crc ^= *data++;            // crc ^= *data; data++;
  507.         for (i = 0; i < 8; ++i)
  508.         {
  509.             if (crc & 1)
  510.                 crc = (crc >> 1) ^ 0xA6BC;        // 0xA6BC = reverse 0x3D65
  511.             else
  512.                 crc = (crc >> 1);
  513.         }
  514.     }
  515.     return ~crc;                // crc^Xorout
  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, uint_len 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. * Name:    CRC-32/MPEG-2  x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
  546. * Poly:    0x4C11DB7
  547. * Init:    0xFFFFFFF
  548. * Refin:   False
  549. * Refout:  False
  550. * Xorout:  0x0000000
  551. * Note:
  552. *****************************************************************************/
  553. uint32_t crc32_mpeg_2(uint8_t *data, uint_len length)
  554. {
  555.     uint8_t i;
  556.     uint32_t crc = 0xffffffff;  // Initial value
  557.     while(length--)
  558.     {
  559.         crc ^= (uint32_t)(*data++) << 24;// crc ^=(uint32_t)(*data)<<24; data++;
  560.         for (i = 0; i < 8; ++i)
  561.         {
  562.             if ( crc & 0x80000000 )
  563.                 crc = (crc << 1) ^ 0x04C11DB7;
  564.             else
  565.                 crc <<= 1;
  566.         }
  567.     }
  568.     return crc;
  569. }
复制代码


使用方法,首先根据数据长度,定义uint_len的类型
比如        typedef uint16_t uint_len;
然后定义一组测试数据
比如         uint8_t serno[] = { 0x91, 0xA3, 0xB5, 0xC7, 0x8D, 0xEB, 0x2D, 0X4E,};
最后输出对应的校验码
    printf("0x%X\n", crc8(serno, sizeof(serno))); //CRC-8
    printf("0x%X\n", crc32(serno, sizeof(serno))); //CRC-32

我是按照网上的crc小工具来的,图片里的所有校验函数都写了


参考资料是AVR-GCC的库util/crc16.h
http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-12-8 00:01:01 | 显示全部楼层
这CRC不错,楼猪辛苦了!!!

出0入0汤圆

发表于 2015-12-8 05:43:20 来自手机 | 显示全部楼层
非常棒,刚好在找着方面的东西

出0入0汤圆

发表于 2015-12-8 07:02:52 | 显示全部楼层
谢谢楼主共享!

出0入0汤圆

发表于 2015-12-8 08:05:45 | 显示全部楼层
多谢分享,不错的资料

出0入0汤圆

发表于 2015-12-8 08:30:55 | 显示全部楼层
先标记,不错资料,谢谢楼主。

出0入0汤圆

发表于 2015-12-8 08:41:01 | 显示全部楼层
不错,mk了

出0入0汤圆

发表于 2015-12-8 08:49:24 | 显示全部楼层
这个不错,先收藏了

出0入0汤圆

发表于 2015-12-8 09:42:52 | 显示全部楼层
CRC校验,MARK

出0入0汤圆

发表于 2015-12-8 12:17:29 | 显示全部楼层
多谢楼主,留贴备用。

出0入17汤圆

发表于 2015-12-8 19:40:39 | 显示全部楼层
很规范的源代码,不错。不过现在STM32自带的CRC硬件更好用。

出0入0汤圆

发表于 2015-12-8 19:41:53 | 显示全部楼层
谢谢分享。

出0入0汤圆

 楼主| 发表于 2015-12-8 20:49:32 | 显示全部楼层
HZKJ 发表于 2015-12-8 19:40
很规范的源代码,不错。不过现在STM32自带的CRC硬件更好用。

主要是针对某些低端芯片,比如avr这种.

出200入2554汤圆

发表于 2015-12-9 11:44:49 | 显示全部楼层
还针对某些有 BT 要求的 CRC 应用场合,例如指定用非标准多项式(POLY)

出0入0汤圆

发表于 2015-12-13 22:07:36 | 显示全部楼层
多谢楼主,备用

出0入0汤圆

发表于 2015-12-13 22:39:56 | 显示全部楼层
如果你会python,有个库叫pycrc,可以生成随便一个计算模式和多项式的代码...

出0入0汤圆

发表于 2015-12-13 22:40:35 | 显示全部楼层
占楼 备用

出0入0汤圆

 楼主| 发表于 2015-12-14 01:16:01 | 显示全部楼层
delazio 发表于 2015-12-13 22:39
如果你会python,有个库叫pycrc,可以生成随便一个计算模式和多项式的代码... ...

恩,刚查了一下,看样子不错,这几天学学python.

出0入0汤圆

发表于 2015-12-14 08:14:35 | 显示全部楼层
e1ki0lp 发表于 2015-12-14 01:16
恩,刚查了一下,看样子不错,这几天学学python.

通用生成器基本没必要。
CRC重要的是你的源代码注释中的那些方向,多项式等信息。

自己做好几个查表法的函数就够了,剩下的就是用预处理器或者函数生成必要的表。。。

资源受限环境半字节查表吧。

出0入0汤圆

发表于 2015-12-14 12:45:38 | 显示全部楼层
学习,谢谢!!!

出0入0汤圆

 楼主| 发表于 2015-12-14 16:39:28 | 显示全部楼层
dr2001 发表于 2015-12-14 08:14
通用生成器基本没必要。
CRC重要的是你的源代码注释中的那些方向,多项式等信息。

短数据,非高速通讯的情况下,逐位运算就够了.表都省了.就一个函数搞定

楼上朋友说的那个pytnon库,我仔细看了一下,确实很好,除了能生成查表法,逐位运算法的C代码好像也可以生成.
多项式,方向,异或输入输出等信息都可以自定义

我确实是重复造轮子了.

出0入0汤圆

发表于 2015-12-14 16:48:24 | 显示全部楼层
留着,备用。谢谢

出0入0汤圆

发表于 2015-12-14 16:55:51 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2016-3-21 11:00:59 | 显示全部楼层
感謝!超級實用。

出0入0汤圆

发表于 2016-6-27 15:49:13 | 显示全部楼层
感谢楼主,用在单片机中非常好

出0入0汤圆

发表于 2016-9-22 14:36:49 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2016-9-26 06:47:49 来自手机 | 显示全部楼层
Mark一下

出0入0汤圆

发表于 2017-2-13 10:58:27 | 显示全部楼层
谢谢,很好用!

出0入0汤圆

发表于 2017-11-7 12:27:29 | 显示全部楼层
wo  mark...............

出0入0汤圆

发表于 2017-12-9 11:38:05 | 显示全部楼层
谢谢,备用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 07:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表