【问题标题】:Trying to Calculating CRC-16 in Python尝试在 Python 中计算 CRC-16
【发布时间】:2017-12-22 14:15:05
【问题描述】:

我开始做一个新的大项目,所以我开始学习 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? 非常感谢!

我的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

二进制:1001111111101100

【问题讨论】:

  • 0xC003 是从哪里来的?
  • 对不起。我将其固定为 0xC005
  • 好的,那0xC005是从哪里来的?
  • 在你解释之前我认为多项式 x^16+x^15+x^2+1 等于 1100000000000101 (0xC005) 而不是 110000000000000101 (0x18005)

标签: python crc crc16


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢。你的回答对我帮助很大!
【解决方案2】:

为什么不使用可用于计算 CRC-16 的库之一?如https://pypi.python.org/pypi/crc16/0.1.1

【讨论】:

  • 我想知道它是如何工作的,并把它变成我自己,因为我需要用其他语言制作它
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多