您的位置:

关于python实现crc校验计算的信息

本文目录一览:

这个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()没有验证过是否正确,仅供参考。