c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...

crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code)

crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code)

CRC (Cyclic Redundancy Check) 校验应用较为广泛, 以前为了处理简单, 在程序中大多数采用lrc (longitudinal Redundancy Check) 校验, lrc校验很好理解, 编程实现简单.用了一天时间研究了crc的c语言实现, 理解和掌握了基本原理和c语言编程.结合自己的理解简单写下来.

1、crc简介

Crc检验的基本思想是利用线性编码理论, 在发送端根据要传送的k位二进制码序列, 以一定的规则产生一个检验码r位 (就是crc码), 附在信息后面, 构成一个新的二进制码序列数共 (K + R) 位, 最后发送出去.接收端根据同样的规则校验, 以确定传送中是否出错.接收端有两种处理方式: 1、计算k位序列的crc码, 与接收到的crc比较, 一致则接收正确.2、计算整个k + r位的crc码, 若为0, 则接收正确.

Crc码有多种检验位数, 8位、16位、32位等, 原理相同.16位的crc码产生的规则是先将要发送的二进制序列数左移16位 (即乘以2的16次方后), 除以一个多项式, 最后所得到的余数就是crc码.

求crc码所采用的是模2运算法则, 即多项式除法中采用不带借位的减法运算, 运算等同于异或运算.这一点要仔细理解, 是编程的基础.

CRC - 16: (美国二进制同步系统中采用) G (X) = x16 + x15 + x2 + 1

CRC CCITT: (由欧洲ccitt推荐) G (X) = x16 + X12 + X5 + 1

CRC - 32: G (X) = + x22 + x32 + x26 X23 + x16 + X12 + X11 + X10 + x8 + X5 + X4 + + X7 x1 + x2 + 1

2、按位计算crc

采用crc - ccitt多项式, 多项式为0x11021, c语言编程时, 参与计算为0x1021, 这个地方得深入思考才能体会其中的奥妙, 分享一下我的思路: 当按位计算crc时, 例如计算二进制序列为1001 1010 1010 1111时, 将二进制序列数左移16位, 即为1001 1010 1010 (1111 0000 0000 0000 0000 0000 0000 0000), 实际上该二进制序列可拆分为1000 (0000 0000 0000 0000 0000 0000 0000 (000) + 0000 0000 0000 0000 0000 0000 0000 (00) + 0000 0000 0000 1 0000 0000 0000 0000) + (0000 0000 0000 0000 +......)

现在开始分析运算:

< 1 > 对第一个二进制分序列求余数, 竖式除法即为0x10000 ^ 0x11021运算, 后面的0位保留;

< 2 > 接着对第二个二进制分序列求余数, 将第一步运算的余数 * 2后再和第二个二进制分序列一起对0x11021求余, 这一步理解应该没什么问题.如果该分序列为0, 无需计算.

对其余的二进制序列求余与上面两步相同 < 3 >.

< 4 > 计算到最后一位时即为整个二进制序列的余数, 即为crc校验码.

该计算方法相当于对每一位计算,

The operation process is easy to understand and accounts for less memory. The disadvantage is that one bit computing is time-consuming.

C language implementation is given below:

Copy the code code as follows:

Unsigned, char, test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa, 0xbb, 0xCC, 0xdd, 0xEE, 0xff};

Unsigned char len = 16;

Void main (void)

{

Unsigned long temp = 0;

Unsigned int crc;

Unsigned char i;

Unsigned, char, *ptr = test;

While (len--) {

For (I = 0x80, I = 0, I = I, 1) {

Temp = temp * 2;

If ((temp & 0x10000) = = 0)

Temp

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值