回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我开始做一个新的大项目,所以我开始学习循环冗余检查。
在我了解了之后,我做了一个(CRC-16,多项式x^16+x^15+x^2+1,等于十六进制0x8005),但当我检查是否做得好时,我发现它是正确的,但不是我想要的答案。
我正在使用网站:<a href="http://crccalc.com/" rel="nofollow noreferrer">http://crccalc.com/</a>
在代码中,我输入了二进制值:0100010101010011(等于0x4553),结果是1001111111101100(等于0x9FEC)
我在网站上发现结果是正确的,但它并不是我期望的结果(我想我会得到0xAD72)。在</p>
<p>我有两个问题:</p>
<ol>
<li><p>如何更改代码以支持CRC-16/ARC而不是CRC-16/BUYPASS?</p></li>
<li><p>为什么多项式x^16+x^15+x^2+1等于0x8005而不是0xC005?
谢谢!</p></li>
</ol>
<p>我的python代码:</p>
<pre><code> 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)
</code></pre>
<p>打印输出:</p>
<p>输入的数据:</p>
<p>六角头:0x4553</p>
<p>二进制:0100010101010011</p>
<p>结果:</p>
<p>六角:0x9fec</p>
<p>二进制:1001111111101100</p>