试图在Python

时间:2017-12-22 14:15:05

标签: python crc crc16

我开始做一个新的大项目,所以我开始学习CRC(循环冗余校验)。 在我了解了它之后,我做了一个(CRC-16,多项式x ^ 16 + x ^ 15 + x ^ 2 + 1,等于十六进制0x8005),但当我检查我是否做得很好时,我发现它是对的,但不是我想要的答案。 我正在使用该网站:http://crccalc.com/ 在代码中,我输入了二进制值:0100010101010011(等于0x4553),得到的结果是1001111111101100(等于0x9FEC) 我在网站上发现了正确的结果,但它不是我期望得到的(我以为我会得到0xAD72)。

我有两个问题:

  1. 如何更改我的代码以支持CRC-16 / ARC而非CRC-16 / BUYPASS?

  2. 为什么多项式x ^ 16 + x ^ 15 + x ^ 2 + 1等于0x8005而不是0xC005? 非常感谢!

  3. 我的python代码:

        def stXor(a,b):
        if(a==b):
            return "0"
        else:
            return "1"
    
    def stshl(str1,shift):
        temp=""
        temp=str1
        for i in range(shift):
            temp=temp[1:]
        return temp
    
    def get_error(data,padding=True):
        good=data
        lst=["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]
        if(padding):
            good=data+"0"*16
        now="0"
    
        while len(good)>0:
    
            now=lst[0]
            lst[0]= stXor(lst[1],now) #x^15
            lst[1]=lst[2]
            lst[2]=lst[3]
            lst[3]=lst[4]
            lst[4]=lst[5]
            lst[5]=lst[6]
            lst[6]=lst[7]
            lst[7]=lst[8]
            lst[8]=lst[9]
            lst[9]=lst[10]
            lst[10]=lst[11]
            lst[11]=lst[12]
            lst[12]=lst[13]
            lst[13]=stXor(lst[14],now)# x^2
            lst[14]=lst[15]
            lst[15]=stXor(good[0],now)
            good=stshl(good,1)
    
    
        a=""
        for letter in lst:
            a+=letter
    
    
        return a
    
    
    data="0100010101010011"
    
    print("data entered: "+"\nhex: "+str(hex(int(data, 2)))+"\nBinary: "+data)
    
    
    a=get_error(data)
    print("Result: "+"\nhex: "+str(hex(int(a, 2)))+"\nBinary: "+a)
    

    打印输出:

    输入的数据:

    hex:0x4553

    Binary:0100010101010011

    结果:

    hex:0x9fec

    二进制:1001111111101100

2 个答案:

答案 0 :(得分:2)

与CRC-16 / BUYPASS相比,CRC-16 / ARC反转计算中的位。这是两者之间的唯一区别。所以只需反转寄存器和输入位。

x 16 + x 15 + x 2 +1以二进制表示,指数的位置设置为1,因此{ {1}}或11000000000000101。在计算中,最高功率定义CRC的长度(在这种情况下为16),并且该位被丢弃,给出0x18005

CRC永远不会以这种方式实施。如果您想了解CRC的定义方式以及如何实施,请阅读Ross Williams' excellent tutorial on CRCs。您可以在Greg Cook's catalog中找到许多CRC的定义。 crcany将为任何CRC生成C代码。

答案 1 :(得分:0)

为什么不使用其中一个库来计算CRC-16?例如https://pypi.python.org/pypi/crc16/0.1.1