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