CRC校验码原理、实例、手动计算
标签:
嵌入式_基础 |
目录
一、CRC16实现代码
二、CRC32编码字符表
三、CRC校验码的手动计算示例
四、CRC校验原理
五、CRC的生成多项式
参考
一、CRC16实现代码
思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位。计算完一个字符后,装入下一个字符。
#include #define crc_mul 0x1021 //生成多项式 unsigned int cal_crc(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned int 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); } int main() { unsigned char i[8] = {0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3}; unsigned int crc; crc=cal_crc(i,8); return 0; }
其实,世界上一共就256个字符,每装载一个就运算一遍,实在是浪费CPU,不如直接把每个字符的CRC都算出来存入数组。因此,就有了CRC编码字符表。
二、CRC32编码字符表
#include unsigned int CRC32_table[256] = {0}; void init_CRC32_table() { for (int i = 0; i != 256; i++) { unsigned int CRC = i; for (int j = 0; j != 8; j++) { if (CRC & 1) CRC = (CRC >> 1) ^ 0xEDB88320; else CRC >>= 1; } CRC32_table[i] = CRC; } } unsigned int GetCRC32(unsigned char* buf, unsigned int len) { unsigned int CRC32_data = 0xFFFFFFFF; for (unsigned int i = 0; i != len; ++i) { unsigned int t = (CRC32_data ^ buf[i]) & 0xFF; CRC32_data = ((CRC32_data >> 8) & 0xFFFFFF) ^ CRC32_table[t]; } return ~CRC32_data; } int main() { unsigned char 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<<span style="color: rgb(128, 0, 128); font-family: 'Courier New' !important;">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除法”(其实就是亦或^)即可得出结果;
四、CRC校验原理
在k位信息码后再拼接r位的校验码,报文编码长度为n位,因此,这种编码又叫(n,k)码。
定理:对于一个给定的(n,k)码,可以证明,存在一个最高次幂为n=k+r的多项式G(x),存在且仅存在一个R次多项式G(x),使得http://images2015.cnblogs.com/blog/753880/201612/753880-20161226114149023-1553693368.png。
其中:
m(x) :k次信息多项式,
r(x) :r-1次校验多项式,
g(x):生成多项式:http://images2015.cnblogs.com/blog/753880/201612/753880-20161226114330179-596321556.png。
发送方通过指定的G(x)产生r位的CRC校验码,接收方则通过该G(x)来验证收到的报文码的CRC校验码是否为0。
五、CRC的生成多项式
主要的生成多项式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 |
注*
|
名称 |
生成多项式 |
数值式 |
简记式 |
标准引用 |
|
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
参考:
http://blog.chinaunix.net/uid-2630593-id-2138511.html

加载中…