Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试在Python中计算CRC-16_Python_Crc_Crc16 - Fatal编程技术网

尝试在Python中计算CRC-16

尝试在Python中计算CRC-16,python,crc,crc16,Python,Crc,Crc16,我开始做一个新的大项目,所以我开始学习CRC(循环冗余校验)。 在我了解它之后,我做了一个(CRC-16,多项式x^16+x^15+x^2+1,等于十六进制0x8005),但当我检查是否做得很好时,我发现它是正确的,但不是我想要得到的答案。 我正在使用以下网站: 在代码中,我输入了二进制值:0100010101010011(等于0x4553),得到的结果是1001111101100(等于0x9FEC) 我在网站上发现这是正确的结果,但它不是我期望得到的(我想我会得到0xAD72) 我有两个问题:

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

我有两个问题:

  • 如何更改代码以支持CRC-16/ARC而不是CRC-16/BUYPASS

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

  • 我的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)
    
    打印输出:

    输入的数据:

    十六进制:0x4553

    二进制代码:0100010101010011

    结果:

    十六进制:0x9fec


    二进制:1001111101100

    为什么不使用一个可用的库来计算CRC-16?例如

    为什么不使用一个可用的库来计算CRC-16?例如,与CRC-16/BUYPASS相比,CRC-16/ARC将计算中的位反转。这是两者之间唯一的区别。所以只要反转寄存器和输入位

    x16+x15+x2+1以二进制表示,指数的位置设置为1,因此
    11000000000000101
    0x18005
    。在计算中,最高的幂定义了CRC的长度(在这种情况下为16),该位被丢弃,给出
    0x8005


    CRC永远不会以这种方式实施。如果您想了解CRC的定义以及如何实现,请阅读。您可以在中找到许多CRC的定义。将为任何CRC生成C代码。

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

    x16+x15+x2+1以二进制表示,指数的位置设置为1,因此
    11000000000000101
    0x18005
    。在计算中,最高的幂定义了CRC的长度(在这种情况下为16),该位被丢弃,给出
    0x8005


    CRC永远不会以这种方式实施。如果您想了解CRC的定义以及如何实现,请阅读。您可以在中找到许多CRC的定义。将为任何CRC生成C代码。

    我想知道它是如何工作的,并让它成为我自己的,因为我需要用其他语言。我想知道它是如何工作的,并让它成为我自己的,因为我需要用其他语言。
    0xC003
    来自哪里?对不起。我把它改为0xC005好,那么
    0xC005
    从哪里来?在你解释之前,我认为多项式x^16+x^15+x^2+1等于1100000000000101(0xC005),而不是1100000000000101(0x18005)
    0xC003
    从哪里来?对不起。我把它改为0xC005好,那么
    0xC005
    从哪里来?在你解释之前,我认为多项式x^16+x^15+x^2+1等于1100000000000101(0xC005),而不是11000000000000101(0x18005),非常感谢。你的回答对我帮助很大!非常感谢你。你的回答对我帮助很大!