社区
软件水平考试
帖子详情
2003网设有这么一道题:循环冗余校验CRC的值怎么算?多项式G(X)=X4+X2+X+1怎么理解?
fengtiehong
2004-05-01 11:49:11
2003网设有这么一道题:
如果CRC的生成多项式为G(X)=X4+X+1,信息码字为10110,则计算出的CRC校验码是
A.0100 B.1010 C.0111 D.1111
怎么做?
在线等待!谢谢!
...全文
1617
9
打赏
收藏
2003网设有这么一道题:循环冗余校验CRC的值怎么算?多项式G(X)=X4+X2+X+1怎么理解?
2003网设有这么一道题: 如果CRC的生成多项式为G(X)=X4+X+1,信息码字为10110,则计算出的CRC校验码是 A.0100 B.1010 C.0111 D.1111 怎么做? 在线等待!谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
canghaiyisujsg
2004-05-04
打赏
举报
回复
因为生成多项式是四次的,所以某个多项式除以生成多项式的余式肯定是三次的,所以要加四位0000。
fengtiehong
2004-05-04
打赏
举报
回复
=============================================
beyondsky00(凌云飞)
首先在信息码后面加上与多项式次数相同的0
即101100000
然后拿这个新得的信息码去与多项式产生的码(10011)进行异或
===============================================
楼主我问:
为什么在在后面加上那4个0后,再与1011进行异或?
而不是信息码[10110]直接去和多项式[10011]异或。
恳求再次回复,谢谢!
beyondsky00
2004-05-04
打赏
举报
回复
CRC的详细过程如下:
假设要发送比特串
11 0 1 0 11,生成多项式为G(x) =x4+x3+ 1
第1步:在串尾加0。0的个数与生成多项式的次数一致(本例中为4)。
这样,串就变成了11010110000。
第2步:将B(x)除以G(x)。余式为R(x) =x3+x,或等价的比特串1 0 1 0。
注意,可以将此写成代数形式:B(x) Q(x)
----=-----+Q ( x )
G(x) G(x)
这里,Q ( x )表示商。可以等价地写成:B(x) =G(x)×Q(x) +R(x)
第3步:定义T ( x )=B ( x )-R ( x )。既然减法是对应项的系数之差,
我们就可以用与每个多项
式对应的比特串之差来计算。本例中,有
11 0 1 0 110000 比特串B
-1010 比特串R
------------------------
11 0 1 0 111010 比特串T
注意,串T实际上是串B将加0部分用R代替所得。另外,如果我们将T ( x )
除以G ( x ), 余数为0 。然后,发送方发送串T。
第4步:若串T传输无误,那么将它除以G ( x ),余数为0。若串T在传输中被损坏了。例如,
中间4个比特变为0,到达串为11 0 0 0 0 0 1 0 1 0。
接收方将它模2再除以G ( x ),余数不为0。
既然余数不为0,接收方就认为发生了错误。
(注意:这不等于说将损坏的串除以G ( x ),其余数总是为非零。
这种情况会发生,但是若G ( x )选取得当,发生的几率就会很小
smart2star
2004-05-03
打赏
举报
回复
http://oldchild.nbc.net.cn/spks/jym.htm
老顽童网站的 校验码辅导讲座
在高程和网工重都会考到的
要觉得还师需要的化 ,看上面仁兄的西安交大的那个
angle419
2004-05-03
打赏
举报
回复
相除
lyt317
2004-05-03
打赏
举报
回复
其实《程序员教程》已经介绍的很清楚了。只不过你除的时候要注意的他的加减规则是
0+1=1;0-1=1;1+0=1;1-0=1;0+0=0;0-0=0;1+1=0;1-1=0不考虑进位,借位。
除法规则是
每商1位则部分余数减一位;
余数最高位为1则商1,否则商0;
当余数的位数小余除数时,该余数为最后余数,
klbt
2004-05-02
打赏
举报
回复
学习!
xta
2004-05-02
打赏
举报
回复
CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。其实现步骤如下:
(1) 设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位,对应的二进制多项式为 。
(2) 用生成多项式g(x)去除 ,求得余数为阶数为r-1的二进制多项式y(x)。此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。
(3) 用 以模2的方式减去y(x),得到二进制多项式 。 就是包含了CRC校验码的待发送字符串。
从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式 ,所以解码时可以用接受到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。许多CRC的硬件解码电路就是按这种方式进行检错的。同时 可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。
为了更清楚的了解CRC校验码的编码过程,下面用一个简单的例子来说明CRC校验码的编码过程。由于CRC-32、CRC-16、CCITT和CRC-4的编码过程基本一致,只有位数和生成多项式不一样。为了叙述简单,用一个CRC-4编码的例子来说明CRC的编码过程。
设待发送的数据t(x)为12位的二进制数据100100011100;CRC-4的生成多项式为g(x)= ,阶数r为4,即10011。首先在t(x)的末尾添加4个0构成 ,数据块就成了1001000111000000。然后用g(x)去除 ,不用管商是多少,只需要求得余数y(x)。下表为给出了除法过程。
除数次数 被除数/ g(x)/结果 余数
0 1 001000111000000 100111000000
1 0011
0 000100111000000
1 1 00111000000 1000000
1 0011
0 00001000000
2 1 000000 1100
1 0011
0 001100
从上面表中可以看出,CRC编码实际上是一个循环移位的模2运算。对CRC-4,我们假设有一个5 bits的寄存器,通过反复的移位和进行CRC的除法,那么最终该寄存器中的值去掉最高一位就是我们所要求的余数。所以可以将上述步骤用下面的流程描述:
//reg是一个5 bits的寄存器
把reg中的值置0.
把原始的数据后添加r个0.
While (数据未处理完)
Begin
If (reg首位是1)
reg = reg XOR 0011.
把reg中的值左移一位,读入一个新的数据并置于register的0 bit的位置。
End
reg的后四位就是我们所要求的余数。
这种算法简单,容易实现,对任意长度生成多项式的G(x)都适用。在发送的数据不长的情况下可以使用。但是如果发送的数据块很长的话,这种方法就不太适合了。它一次只能处理一位数据,效率太低。为了提高处理效率,可以一次处理4位、8位、16位、32位。由于处理器的结构基本上都支持8位数据的处理,所以一次处理8位比较合适。
为了对优化后的算法有一种直观的了解,先将上面的算法换个角度理解一下。在上面例子中,可以将编码过程看作如下过程:
由于最后只需要余数,所以我们只看后四位。构造一个四位的寄存器reg,初值为0,数据依次移入reg0(reg的0位),同时reg3的数据移出reg。有上面的算法可以知道,只有当移出的数据为1时,reg才和g(x)进行XOR运算;移出的数据为0时,reg不与g(x)进行XOR运算,相当与和0000进行XOR运算。就是说,reg和什么样的数据进行XOR移出的数据决定。由于只有一个bit,所以有 种选择。上述算法可以描述如下,
//reg是一个4 bits的寄存器
初始化t[]={0011,0000}
把reg中的值置0.
把原始的数据后添加r个0.
While (数据未处理完)
Begin
把reg中的值左移一位,读入一个新的数据并置于register的0 bit的位置。
reg = reg XOR t[移出的位]
End
上面算法是以bit为单位进行处理的,可以将上述算法扩展到8位,即以Byte为单位进行处理,即CRC-32。构造一个四个Byte的寄存器reg,初值为0x00000000,数据依次移入reg0(reg的0字节,以下类似),同时reg3的数据移出reg。用上面的算法类推可知,移出的数据字节决定reg和什么样的数据进行XOR。由于有8个bit,所以有 种选择。上述算法可以描述如下:
//reg是一个4 Byte的寄存器
初始化t[]={…}//共有 =256项
把reg中的值置0.
把原始的数据后添加r/8个0字节.
While (数据未处理完)
Begin
把reg中的值左移一个字节,读入一个新的字节并置于reg的第0个byte的位置。
reg = reg XOR t[移出的字节]
End
算法的依据和多项式除法性质有关。如果一个m位的多项式t(x)除以一个r阶的生成多项式g(x), ,将每一位 (0=<k<m)提出来,在后面不足r个0后,单独去除g(x),得到的余式位 。则将 后得到的就是t(x)由生成多项式g(x)得到的余式。对于CRC-32,可以将每个字节在后面补上32个0后与生成多项式进行运算,得到余式和此字节唯一对应,这个余式就是上面算法种t[]中的值,由于一个字节有8位,所以t[]共有 =256项。多项式运算性质可以参见参考文献[1]。这种算法每次处理一个字节,通过查表法进行运算,大大提高了处理速度,故为大多数应用所采用。
摘自:循环冗余校验 CRC的算法分析和程序实现
西南交通大学计算机与通信工程学院 刘东
beyondsky00
2004-05-02
打赏
举报
回复
应该是D
首先在信息码后面加上与多项式次数相同的0
即101100000
然后拿这个新得的信息码去与多项式产生的码(10011)进行异或
最后结果所得的余数即为校验码
自己去算下试试
循环冗余校验
参考.pdf
循环冗余校验
参考.pdf
循环冗余校验
crc
循环冗余校验
的原理,学习该理论
理解
通信原理很重要
CRC
校验方法详细总结
关于
CRC
校验的资料,有正序反序方法的介绍,并且还有代码例子,没有从数学方法上入手,而从解决问
题
的角度进行讲解
CRC
检验的介绍及C++实现,
CRC
码生成程序
本压缩包包含
CRC
的介绍及生成
算
法;c++实现的源代码还有校验
CRC
码的程序,此此程序以ModBus RTU的形式生成
CRC
校验码
crc
8查表法校验程序和校验检查软件
crc
8校验的原理,程序和检验软件
CRC
即
循环冗余校验
码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
CRC
校验可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即
CRC
校验码),来判断接收的数据是否正确。在发送端,根据要传送的k位二进制码序列,以一定的规则(
CRC
校验有不同的规则。这个规则,在差错控制理论中称为“生成
多项式
”。)产生一个校验用的r位校验码(
CRC
码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和
CRC
码之间所遵循的规则(即与发送时生成
CRC
校验码相同的规则)进行检验,校验采用计
算
机的模二除法,即除数和被除数(即生成
多项式
)做异或运
算
,进行异或运
算
时除数和被除数最高位对齐,进行按位异或运
算
,若最终的数据能被除尽,则传输正确;否则,传输错误。
CRC
8即最终生成的
CRC
校验码为1字节,其生成
多项式
,生成
多项式
为g(x)=x8+x5+
x4
+1,相当于g(x)=1•x8+0•x7+0•x6+1•x5+1•
x4
+0•x3+0•
x2
+0•x1+1•x0,即对应的二进制数为100110001。
CRC
8校验
算
法: 1.
CRC
8校验的一般性
算
法: 例如: 信息字段代码为: 00000001 00000010 ———— 对应m(x)=x8+x 生成
多项式
为:g(x)=x8+x5+
x4
+1 ———— 对应g(x)的二进制代码为:100110001 现在我们将要对2字节数据0x0102生成
CRC
8校验码,并最终将生成的1字节
CRC
校验码跟在0x0102的后面,即 0x01 02 ##,(##即8为
CRC
码),最终生成的3字节数据就是经
CRC
8校验生成的数据。 先计
算
x8m(x)=x16+x9,对应的2进制数为:100000010 00000000 。可以看到这样运
算
所得到的结果其实就是将信息字段代码的数左移8位。因为最终要将生成的8位
CRC
8校验码附在信息字段的后面,所以要将信息字段的数左移8位。最后用x8m(x)得到的二进制数对生成
多项式
g(x)进行模二运
算
,最终的余数(其二进制数的位数一定比生成
多项式
g(x)的位数小)就是所要的
CRC
8校验码。 100000010 00000000 ^ 100110001 --------------------------- 000110011 00000000 ^ 100110 001 --------------------------- 010101 00100000 ^ 10011 0001 --------------------------- 00110 00110000 ^ 100 110001 --------------------------- 010 11110100 ^ 10 0110001 --------------------------- 00 10010110 对x8m(x)做模二运
算
取余得10010110(0x96),这个8位的二进制数就是
CRC
8校验码。所以,经
CRC
8校验后研发送的数据就是0x010296。 2.
CRC
8校验在DS18B20中的应用: 以上分析的是常规的
CRC
8校验方法。在DS18B20中,有两处用到
CRC
。一是DS18B20的8字节的序列号,最后一字节是前面七个字节的
CRC
码,这是为了保证序列号的唯一性与正确性;另一个是在DS18B20内部9字节的高速温度存储器,其第9字节是前面8个字节的
CRC
校验码,这是为了温度数据传输的正确性。而在DS18B20中生成
CRC
码所用到的方法不同于常规生成
算
法,它采用的是逆序
CRC
信息单元编码
算
法,该
CRC
的生成是由DS18B20中的
多项式
寄存器通过其中所包含的移位寄存器以及异或门对输入该
多项式
寄存器的每一位二进制数做一定的运
算
所得到的
CRC
码(可以查看Maxim官
网
上DS18B20的应用笔记Note27,专门介绍DS18B20
CRC
详细生成过程)。在此列举两种DS18B20
CRC
校验的C程序。
软件水平考试
2,958
社区成员
22,569
社区内容
发帖
与我相关
我的任务
软件水平考试
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
复制链接
扫一扫
分享
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证
c4java
c4前端
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章