CRC循环冗余码原理简述及python代码实现

CRC循环冗余码原理简述及python代码实现

CRC循环冗余码在计算机组成原理和计算机网络中都有重要的地位,但也不太好懂。
本人通过华南理工大学袁华老师的计算机网络(中国大学mooc平台)课程对CRC编码有了一点肤浅的认识,结合自己踩过的一些坑,最后给出CRC循环冗余码的python实现,希望能对想了解CRC编码的同学有点帮助。本文中引用了袁华老师课件中的图片,侵删。

如对程序实现感兴趣可直接跳过前面内容

要理解CRC的运算过程,先要了解模2运算,这是CRC编码中的运算规则。
CRC循环冗余码原理简述及python代码实现_第1张图片
简单来说,模2运算就是对两个长度相同的二进制数进行异或运算。

接下来给出一个简单的CRC编码的实例
CRC循环冗余码原理简述及python代码实现_第2张图片
在需要加密的数据(图片里是一个数据桢)后面添加(除数位数-1)位的0,用这个数对除数做模2除法。并把最后得到的余数加到原始帧的后面,得到编码后的数据。

CRC循环冗余码原理简述及python代码实现_第3张图片
这个图片做了详细介绍

接下来是解码过程
CRC循环冗余码原理简述及python代码实现_第4张图片
解码过程和加密过程类似,用需要解码的数据对除数做模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编码的了解,希望能对你有所帮助。代码实现可以帮助你验证你的计算是否错误,仅做学习用途。

你可能感兴趣的:(python,CRC,循环冗余码,代码实现)