CRC循环冗余码原理简述及python代码实现
CRC循环冗余码在计算机组成原理和计算机网络中都有重要的地位,但也不太好懂。
本人通过华南理工大学袁华老师的计算机网络(中国大学mooc平台)课程对CRC编码有了一点肤浅的认识,结合自己踩过的一些坑,最后给出CRC循环冗余码的python实现,希望能对想了解CRC编码的同学有点帮助。本文中引用了袁华老师课件中的图片,侵删。
如对程序实现感兴趣可直接跳过前面内容
要理解CRC的运算过程,先要了解模2运算,这是CRC编码中的运算规则。
简单来说,模2运算就是对两个长度相同的二进制数进行异或运算。
接下来给出一个简单的CRC编码的实例
在需要加密的数据(图片里是一个数据桢)后面添加(除数位数-1)位的0,用这个数对除数做模2除法。并把最后得到的余数加到原始帧的后面,得到编码后的数据。
这个图片做了详细介绍
接下来是解码过程
解码过程和加密过程类似,用需要解码的数据对除数做模2除法,如果余数为0,则代码没有检测出错误(有可能发生了错误但刚好余数也为0)
如此可以完成CRC的编码和解码过程。
接下来是python代码实现。
def XOR(str1, str2): #实现模2减法
ans = ''
if str1[0] == '0':
return '0', str1[1:]
else:
for i in range(len(str1)):
if (str1[i] == '0' and str2[i] == '0'):
ans = ans + '0'
elif (str1[i] == '1' and str2[i] == '1'):
ans = ans + '0'
else:
ans = ans + '1'
return '1', ans[1:]
def CRC_Encoding(str1,str2): #CRC编码
lenght = len(str2)
str3 = str1 + '0'*(lenght-1)
ans = ''
yus = str3[0:lenght]
for i in range(len(str1)):
str4,yus = XOR(yus, str2)
ans = ans+str4
if i == len(str1)-1:
break
else:
yus = yus+str3[i+lenght]
ans = str1 + yus
return ans
def CRC_Decoding(str1,str2): #CRC解码
lenght = len(str2)
str3 = str1 + '0'*(lenght-1)
ans = ''
yus = str3[0:lenght]
for i in range(len(str1)):
str4,yus = XOR(yus, str2)
ans = ans+str4
if i == len(str1)-1:
break
else:
yus = yus+str3[i+lenght]
return yus == '0'*len(yus)
def main(): #主函数
while True:
print('=='*30)
setting = input("请输入运行模式(0:退出,1:CRC编码,2:CRC验证):")
if setting == '0':
break
elif setting == '1':
str1 = input("请输入数据:")
str2 = input("请输入生成比特模式:")
str3 = CRC_Encoding(str1,str2)
print("{} 编码后为: {}".format(str1,str3))
elif setting == '2':
str1 = input("请输入验证数据:")
str2 = input("请输入生成比特模式:")
flag = CRC_Decoding(str1,str2)
if flag:
print("验证完成,未出错")
else:
print("sorry 验证数据已出错")
else:
print("请正确输入:")
main()
好了,这就是我对CRC编码的了解,希望能对你有所帮助。代码实现可以帮助你验证你的计算是否错误,仅做学习用途。
版权声明:本文为qq_31064397原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。