您的位置:首页 > 编程语言 > C语言/C++

用C语言实现CRC校验

2016-11-11 21:59 190 查看
1、原理

假如每次参和CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位和信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。

组合值只有256种可能,因此可利用硬件模拟算法先算好他们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。

2、程序

CRC生成多项式及CRC值表定义为一个头文档CRC.H:

#define CRC_CCITT 0x1021  //CCITT多项式

#define REV_CCITT 0x8408  //反转CCITT多项式

#define CRC16 0x8005      //CRC16多项式

#define REV_CRC16 0x001  //反转CRC16多项式

unsigned short crc_tble[256]; //CRC值表

注:16位CCITT多项式(X16 +X12 +X5 +1)和16位CRC16多项式(X16 +X15 +X2+1)为两种最常用的CRC多项式。反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响CRC计算速度,故设反转多项式。

造表和查表法CRC计算函数。

#include "crc.h"

void mk_crctble(unsigned short genpoly)

unsigned short crc_tble[256];

unsigned short ccnum=0;

unsigned short i,j,k;

for(i=0,k=0;i<256;i++,k++)   

  i<<=8;

     for(j=8;j>0;j--)     

        if((i^ccnum)&0x8000)

            ccnum=(ccnum<<=1)^genpoly;

        else 

            ccnum<<=1;

   i<<=1;        

      crc_tble[k]=ccnum;   

 void crc_updte(unsigned short dt,unsigned short ccnum)

ccnum=(ccnum<<=8)^crc_tble[(ccnum>>8)^dt]; 

注:genpoly为CRC多项式,

ccnum为累加器值(即为新的CRC值),d

t
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: