tcp中的crc检验算法原理_CRC校验码原理、实例、手动计算

本文详细介绍了TCP中CRC校验的实现,包括CRC16和CRC32的编码,手动计算示例,以及CRC校验原理和生成多项式的选择。通过代码展示了CRC16的计算过程,并给出了CRC32的编码字符表。此外,还解释了CRC校验码的计算方法和生成多项式的条件。
摘要由CSDN通过智能技术生成

目录

一、CRC16实现代码

二、CRC32编码字符表

三、CRC校验码的手动计算示例

四、CRC校验原理

五、CRC的生成多项式

参考

一、CRC16实现代码

思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位。计算完一个字符后,装入下一个字符。

#include

#define crc_mul 0x1021 //生成多项式unsignedint cal_crc(unsigned char *ptr, unsigned charlen)

{

unsignedchari;

unsignedint crc=0;while(len-- != 0)

{for(i=0x80; i!=0; i>>=1)

{if((crc&0x8000)!=0)

{

crc<<=1;

crc^=(crc_mul);

}else{

crc<<=1;

}if((*ptr&i)!=0)

{

crc^=(crc_mul);

}

}

ptr++;

}return(crc);

}intmain()

{

unsignedchar i[8] = {0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};

unsignedintcrc;

crc=cal_crc(i,8);return 0;

}

其实,世界上一共就256个字符,每装载一个就运算一遍,实在是浪费CPU,不如直接把每个字符的CRC都算出来存入数组。因此,就有了CRC编码字符表。

二、CRC32编码字符表

#includeunsignedint CRC32_table[256] = {0};voidinit_CRC32_table()

{for (int i = 0; i != 256; i++)

{

unsignedint CRC =i;for (int j = 0; j != 8; j++)

{if (CRC & 1)

CRC= (CRC >> 1) ^ 0xEDB88320;elseCRC>>= 1;

}

CRC32_table[i]=CRC;

}

}

unsignedint GetCRC32(unsigned char* buf, unsigned intlen)

{

unsignedint CRC32_data = 0xFFFFFFFF;for (unsigned int i = 0; i != len; ++i)

{

unsignedint t = (CRC32_data ^ buf[i]) & 0xFF;

CRC32_data= ((CRC32_data >> 8) & 0xFFFFFF) ^CRC32_table[t];

}return ~CRC32_data;

}intmain()

{

unsignedchar i[8] = {0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};

init_CRC32_table();

printf("BUFFER i's CRC32: 0x%x\n", GetCRC32(i,8));

printf("CRC32 TABLE:\n");for(int i=0;i<256;i++)

{

printf("0x%8x\t",CRC32_table[i]);if((i+1)%8 == 0)

printf("\n");

}

}

三、CRC校验码的手动计算示例

生成多项式:G(X)=X4+X3+1,要求出二进制序列10110011的CRC校验码。

(1)G(X)=X4+X3+1,二进制比特串为11001;(有X的几次方,对应的2的几次方的位就是1)

(2)因为校验码4位,所以10110011后面再加4个0,得到101100110000,用“模2除法”(其实就是亦或^)即可得出结果;

图5-10 CRC校验码计算示例

(3)CRC^101100110000得到101100110100。发送到接收端;

(4)接收端收到101100110100后除以11001(以“模2除法”方式去除),余数为0则无差错;

四、CRC校验原理

在k位信息码后再拼接r位的校验码,报文编码长度为n位,因此,这种编码又叫(n,k)码。

定理:对于一个给定的(n,k)码,可以证明,存在一个最高次幂为n=k+r的多项式G(x),存在且仅存在一个R次多项式G(x),使得

其中:

m(x) :k次信息多项式,

r(x) :r-1次校验多项式,

g(x):生成多项式:

发送方通过指定的G(x)产生r位的CRC校验码,接收方则通过该G(x)来验证收到的报文码的CRC校验码是否为0。

假设发送信息用信息多项式C(X)表示,将C(x)左移r位,则可表示成C(x)*2r,这样C(x)的右边就会空出r位校验码的位置,做除法(模2除)

,得到的余数R就是校验码。发送的CRC编码是

,验证接收到的报文编码是否至正确,依然是做模2除:

五、CRC的生成多项式

生成多项式的选取应满足以下条件:

a、生成多项式的最高位和最低位必须为1。

b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后,应该使余数不为0。

c、不同位发生错误时,应该使余数不同。

d、对余数继续做模2除,应使余数循环。

主要的生成多项式G(x)有以下几种:

名称

生成多项式

数值式

简记式

标准引用

CRC-16

x16+x15+x2+1

0x1’8005

8005

IBM SDLC

CRC-CCITT

x16+x12+x5+1

0X1’1021

0x1021

ISO HDLC,ITU

X.25,V.34/V.41/V.42,PPP-FCS

CRC-32

注*

0X1’04C11DB7

0x04C11DB7

ZIP,RAR,IEEE 802

LAN/FDDI,IEEE1394,PPP-FCS

注* x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

下表中的生成多项式G(x)也常见的:

名称

生成多项式

数值式

简记式

标准引用

CRC-4

x4+x+1

0x1’3

0x3

ITU G.704

CRC-8

x8+x5+x4+1

0x1’31

0x31

CRC-8

x8+x2+x1+1

0x1’07

0x07

CRC-8

x8+x6+x4+x3+x2+x1

0x1’5E

0x5E

CRC-12

x12+x11+x3+x2+x+1

0x1’80F

0x80F

CRC-32c

注**

0X1’1EDC6F41

0x1EDC6F41

SCTP

注**

x32+x28+x27+x26+x25+x23+x22+x20+x19+x18+x14+x13+x11+x10+x9+x8+x6+1

参考:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值