[技术问答] CRC16常用算法

[复制链接]
 楼主| loutin 发表于 2024-8-24 07:02 | 显示全部楼层 |阅读模式



  1. /****************************Info**********************************************
  2. * Name:    CRC-16/CCITT        x16+x12+x5+1
  3. * Width:        16
  4. * Poly:    0x1021
  5. * Init:    0x0000
  6. * Refin:   True
  7. * Refout:  True
  8. * Xorout:  0x0000
  9. * Alias:   CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT
  10. *****************************************************************************/
  11. #if 0
  12. unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen)
  13. {
  14.         unsigned short wCRCin = 0x0000;
  15.         unsigned short wCPoly = 0x1021;
  16.         unsigned char wChar = 0;
  17.        
  18.         while (datalen--)        
  19.         {
  20.                 wChar = *(data++);
  21.                 InvertUint8(&wChar,&wChar);
  22.                 wCRCin ^= (wChar << 8);
  23.                 for(int i = 0;i < 8;i++)
  24.                 {
  25.                         if(wCRCin & 0x8000)
  26.                                 wCRCin = (wCRCin << 1) ^ wCPoly;
  27.                         else
  28.                                 wCRCin = wCRCin << 1;
  29.                 }
  30.         }
  31.         InvertUint16(&wCRCin,&wCRCin);
  32.         return (wCRCin);
  33. }
  34. #else
  35. //这里为了效率,我们不需要将所有Refin和refout为true的输入输出数据移位转换
  36. //只需要将poly二项式转换后,运算时将左移变为右移
  37. unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen)
  38. {
  39.         unsigned short wCRCin = 0x0000;
  40.         unsigned short wCPoly = 0x1021;
  41.         unsigned char wChar = 0;
  42.        
  43.         InvertUint16(&wCPoly,&wCPoly);
  44.         while (datalen--)        
  45.         {
  46.                 wCRCin ^= *(data++);
  47.                 for(int i = 0;i < 8;i++)
  48.                 {
  49.                         if(wCRCin & 0x01)
  50.                                 wCRCin = (wCRCin >> 1) ^ wCPoly;
  51.                         else
  52.                                 wCRCin = wCRCin >> 1;
  53.                 }
  54.         }
  55.         return (wCRCin);
  56. }
  57. #endif


您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

1624

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

84

主题

1624

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部