本文目录一览:
- 1、这个CRC编码怎么算啊
- 2、你好,求教crc校验
- 3、python求crc32的值
- 4、用查表发实现crc16校验怎么实现
- 5、用python语言 如何将test1.txt中一串数字进行crc校验存入test2.txt中
这个CRC编码怎么算啊
2018年01月07日,星期日,
不好意思,今天刚看到,
我先大概说一下CRC相关概念,然后咱们开始解题,
1、多项式形式与二进制形式是有关联的,因子是对应的,
比如,题中,发送多项式为:X^11+X^8+X^7+X^6+X^4+X^3+X^2+1,
就是:2^11+2^8+2^7+2^6+2^4+2^3+2^2+1,
所以,对应的二进制形式为:100111011101,
这里的发送多项式说的就是,未经CRC校验运算的原始数据,
2、同理,CRC生成多项式也与一组二进制数相对应,
例如,题中,CRC生成多项式为:x^4+x^2+x^1+1,
就是:2^4+2^2+2^1+1,
对应的二进制是:10111,
生成多项式是人为指定的,没有固定值,指定成x^4+x^3+x^2+x^1+1即11111也行,
3、发送多项式的二进制形式是:100111011101,这是我们的原始数据,
CRC生成多项式的二进制形式是:10111,我们要使用它来按照CRC规则与原始数据进行运算后,得出我们要在线路上传输的,经过CRC校验的,原始数据的CRC编码,
这里比较绕,简单点理解就是,我们要通过给出的CRC生成多项式,用它与原始数据进行计算后,得到的带有CRC校验的一串二进制数,我们把这串带有CRC校验的二进制就称为原始数据的CRC编码,就是题目中的“该发送多项式的CRC编码”,
4、接下来就是CRC计算规则了,
发送多项式的二进制形式,向左移动(CRC生成多项式最高次幂的指数)这么些位,本题CRC生成多项式最高次幂是X^4,因此,发送多项式要左移4位,
计算如下:
100111011101 * 2^4
=100111011101 0000,
这样经过计算后,原始数据的右侧多出了4个0,也就是多出了4个空位,在将来通过计算得出的CRC校验码就要放到这4个空位中,4位的CRC校验码就要填充到这挪出的4个车位,
按CRC规则,使用变形后的发送多项式的二进制形式:1001110111010000去除以CRC生成多项式的二进制形式:10111,
请注意,这里使用的除法,不是数学领域的除法,而是指计算机中的模二除的计算方式,实际上就是异或运算,实际的操作方法是,将两个数高位对齐也就是左对齐,然后按位异或,若相同则结果为0,若不同则结果为1,然后将得到的数再与除数(就是生成多项式)相除,直到最后得到最终的余数,一般来说,我们按照CRC校验规则经过运算,一般是除不尽的,这个余数就是我们需要的CRC校验码,将这个CRC校验码按照CRC规则与变形后(也就是右边加了4个零的原始数据)的原始数据组合到一起就是最终的答案,
计算步骤如下:
1001110111010000/10111
…………………………………………
1001110111010000 被除数 ,变形后的原始数据,
10111 除数 ,CRC生成多项式
—————————
0010010111010000 商,下一步继续除以CRC生成多项式:10111
…………………………………………
10010111010000 被除数,就是上一步运算得到的,商,
10111 除数
————————
00101111010000 商,下一步继续除以CRC生成多项式:10111
……………………………………………
101111010000 被除数,即上一步得到的商
10111 除数
———————
000001010000 商
………………………………………………
1010000 被除数
10111 除数
———
0001100 余数(也是最后一步运算得到的商,因为位数不足5位不能再继续除了,4位 的1100不能再与5位的CRC生成多项式 10111,进行模二除的运算了,所以就把这个商称为余数了,)
按照CRC校验运算规则,将经过上一步运算后得到的CRC校验码:1100,与变形后的原始数据:1001110111010000,组合到一起,就是我们最终需要的,在线路上传送的,带有CRC校验码的,CRC编码,也就是题目中说的,该发送多项式的CRC编码,
计算过程如下:
1001110111010000+1100
………………………………………………
100111011101 0000
+ 1100
——————————
100111011101 1100
这里需要说明的是,只有理解了CRC编码的规则,才能在将来遇到此类问题时从容应对,我给你的建议是,多做题,最好是有正确答案的题目,这样在做题的过程中,会加深你对CRC编码的理解,
最后,我们再来复习一下,CRC编码的规则,
1、原始数据多项式,我们一般称为:C(X),也有称为m(x)的,
2、生成多项式 generator polynomial,我们一般称为:G(x)。
3、CRC校验码,我们一般称为: r(x),
4、我们,先用变形后的C(X),去除以G(x),得到r(x),然后,再将变形后的C(X),与r(x)组合,就得到了最终我们需要的带CRC校验的CRC编码。
这里想再说一下,为什么生成多项式的最高次幂是几,最后的余数就是几位的,
比如本例中,生成多项式为:x^4+x^2+x^1+1,最后的余数就是4位的1100,
这个规则是可以推导出来的,
首先,将生成多项式中的 1 改写成 x^0,则有 x^4+x^2+x^1+x^0,
这就很明显可以看出来,指数是从0开始的,虽然中间有一个指数3因为该权位上的值为0而没有写在这个生成多项式中,但是在该生成多项式的二进制形式中该权位上是数字0,这不是重点,
重点是,我们可以一目了然的看出来,指数是从0开始的,而不是从1开始的,所以,以本题为例,当生成多项式的最高次幂为x^4即指数为4时,该幂所在的权位的右侧一定有4位二进制数,因为该幂的权位决定了这个生成多项式一定是一个5位的二进制数,而最高幂所在的权位是右数第五个位置,所以它的右边一定还有4个二进制位,
结合开头描述的,要让原始值去乘,2的,生成多项式的最高次幂这么多次方,也就是让原始值向左移动多少位,好腾出地方放置余数,
还有一个很巧妙的地方是,因为生成多项式的二进制形式中,最高位一定是1,所以,和加了0的原始值进行异或运算,到最后得到的余数的位数一定比生成多项式的二进制形式的位数小,拿本例来说,生成多项式是:
x^4+x^2+x^1+1
对应的二进制形式是:
10111
所以,不管原值最后剩下什么组合,只要和 10111左对齐后,因为要进行异或的操作,最高位一定变0,所以,最后的余数的二进制位数一定小于生成多项式的二进制位数,
再结合,指数从0开始,
所以,生成多项式的最高次幂,可以决定余数的位数,
你好,求教crc校验
CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
工作原理
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
python求crc32的值
本文实例讲述了python求crc32值的方法。分享给大家供大家参考。具体实现方法如下:
要想求CRC值,前面要import binascii
binascii.crc32(v) 求出了v的crc32值,这是一个long型,形如-1456387L,把这个值0xffffffff得到的值形如48a213L的形式。
然后把这个值用16进制表示出来、
具体代码如下:
def _crc32(self, v):
"""
Generates the crc32 hash of the v.
@return: str, the str value for the crc32 of the v
"""
return '0x%x' % (binascii.crc32(v) 0xffffffff) #取crc32的八位数据 %x返回16进制
用查表发实现crc16校验怎么实现
1)将上次计算出的CRC校验码右移一个字节;
(2)将移出的这个字节与新的要校验的字节进行XOR 运算;
(3)用运算出的值在预先生成码表中进行索引,获取对应的值(称为余式);
(4)用获取的值与第(1)步右移后的值进行XOR 运算;
(5)如果要校验的数据已经处理完,则第(4)步的结果就是最终的CRC校验码。如果还有数据 要进行处理,则再转到第(1)步运行。
CRC32=CRC_32_Tbl[(CRC32^((unsigned__int8*)p)[i])0xff]^(CRC328);
怎么样?简单吧。
用python语言 如何将test1.txt中一串数字进行crc校验存入test2.txt中
给你写几个。这个本来很简单的。
import binascii
import struct,ctypes
fp1=open('test1.txt','rb')
fp2=open('test2.txt','wb')
c=fp1.read(1)
crc = binascii.crc32(c)
while True:
fp2.write(c)
c=fp1.read(1)
if not c:break
crc = binascii.crc32(" world", crc) 0xffffffff
fp2.write(struct.pack('l'crc))
fp2.close()
fp1.close()没有验证过是否正确,仅供参考。