CRC

生成步骤

1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当于对应的信息多项式C(X)*2R
3、用生成多项式( 二进制数 )对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
【例】假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。
解:
1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。
2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010 000
3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或:
1010000
1011
------------------
0001000
0001011
------------------
0000011
得到的余位011,所以最终编码为:1010 011
03-08
### CRC循环冗余校验算法解释 CRC校验基于GF(2)多项式算术,即模-2除法的余数运算,实质上是异或操作[^1]。此方法通过在原始数据之后附加一定数量的冗余位来形成完整的传输单元,这些冗余位用于差错检测。 对于长度为\( k \)的数据序列,在其后添加 \( r \)个比特作为冗余码,使得整个消息变为 \( n=k+r \)比特长,并以此形式发送出去。这里存在一个最高次幂等于\( n-k=r \) 的多项式\( G(x) \),依据该多项式可生成对应的校验码。当涉及到实际应用时,比如在网络通信领域内,\( k \)往往非常大,可能达到上千乃至数千比特,此时常选用16位的标准生成多项式如CRC-16 或者 CRC-CCITT 来创建校验位[^2]。 #### C语言中的CRC实现示例 下面给出一段简单的C语言代码片段用来展示如何利用指定的生成多项式计算CRC值: ```c #include <stdio.h> #define POLYNOMIAL 0xA001 /* 这里定义了一个常见的16-bit CRC多项式的反向表示 */ unsigned short crc16(const unsigned char *data, int length){ unsigned short crc = 0xFFFF; while(length--){ crc ^= (*data++) << 8; // 将当前字节加入到crc中 for(int i=0;i<8;++i){ if(crc & 0x8000) crc=(crc<<1)^POLYNOMIAL; else crc=crc<<1; } } return crc; } int main(){ const char* message="hello world"; printf("CRC16 of '%s' is %04X\n",message,crc16((const unsigned char*)message,strlen(message))); return 0; } ``` 上述程序展示了怎样针对给定字符串计算其CRC16校验值的过程。注意这里的`POLYNOMIAL`被设为了十六进制数值`0xA001`,这代表了一种特定类型的CRC-16标准——反转后的版本。此外,这段代码还体现了基本的移位和按位逻辑运算技巧,这些都是执行CRC计算所必需的操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值