1、描述CRC循环冗余校验技术。
CRC是Cyclic Redundancy Check的缩写,中文叫循环冗余校验,维基百科的定义是这样的:CRC是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表。
2、编程实现CRC循环冗余校验。
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) #补0
ans = ''
yushu = str3[0:lenght]
for i in range(len(str1)):
str4, yushu = XOR(yushu, str2)
ans = ans + str4
if i == len(str1) - 1:
break
else:
yushu = yushu + str3[i + lenght]
ans = str1 + yushu
return ans
def CRC_Decoding(str1, str2): # CRC解码
lenght = len(str2)
str3 = str1 + '0' * (lenght - 1)
ans = ''
yushu = str3[0:lenght]
for i in range(len(str1)):
str4, yushu = XOR(yushu, str2)
ans = ans + str4
if i == len(str1) - 1:
break
else:
yushu = yushu + str3[i + lenght]
return yushu == '0' * len(yushu)
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()
#测试数据:10110011 11001 得到 101100110100
#测试数据:101100110100 11001
3、编程实现卷积码。
def encode(var):
code = []
#(2,1,2)卷积码
register_2 = 0
register_1 = 0
for i in var:
c_1 = (i + register_1 + register_2)%2
c_2 = (i+register_2)%2
code.append(c_1)
code.append(c_2)
register_2 = register_1
register_1 = i
print("卷积编码为:",code)
input_list=list(input("Please input bin data:"))
for i in range(len(input_list)):
input_list[i] = int(input_list[i])
print(input_list)
encode(input_list)
#测试数据: 10110
实验结果:
CRC:
卷积编码: