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