用C语言实现CRC校验

本文介绍了CRC校验的基本原理,包括信息字节与CRC累加器的异或过程,以及通过预先计算的组合值表格来高效进行CRC计算。同时,提供了C语言实现CRC校验的代码,包括生成CRC多项式表的函数`mk_crctble`和更新CRC值的函数`crc_updte`,使用了16位CCITT和CRC16两种常用的CRC多项式。
摘要由CSDN通过智能技术生成

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值