python crc16校验,python crc32校验

  python crc16校验,python crc32校验

  文章1,简介2,算法思路3,代码

  一.导言

  详细了解CRC算法

  二、算法的思想是输入时直接输入生成多项式,但我们在计算CRC校验码时需要将生成多项式转换成相应的二进制序列。

  转换方法如下图所示。(x4表示x的4次方,生成多项式的1等价于X0。)

  了解转换方法后,就可以设计相应的算法了。

  我的想法如下

  将传递的数据转换成大写,然后在后续处理中根据个数将多项式分成多个字符串。上图中的例子将这些拆分的字符串拆分成x4、x3和1,并将它们存储在一个列表中。Lis总是将生成多项式的最右侧设置为1,所以定义变量string并将其直接初始化为列表中的最后一个元素,以删除列表中的最后一个元素。如果字符串的长度与数字X4和X3的值相同,遍历列表lis(相当于从右向左扫描而不遍历数字1)指示该位的二进制数为1。串遍历X3现在正在遍历X0的位置,但是由于生成多项式中不存在X2,所以需要用一个循环来补充X2,然后需要在当前位置加1,因此,3360 中要加的零个数是len (lis [I] [1])-len [strinis [1]], 将生成多项式转换成二进制字符串并输出 #输入数据处理expression=expresion大写转换lis=list(expression.split())加号作为标记将数字1 delis(-1)lis=lis(:3360-1))在sttion多项式的末尾)52二进制变换forIinrange(len(lis)):如果len (string)满足与变量数相同的位数, string= 1 else 3360 for j-len(string)(33603360)用0来补充字符串的不同位数= 0 string= 1 return string(main函数需要使用尾数来得出结果因此,在执行XOR时,如果二进制字符串的长度可能不同,就需要处理输入数据并追加一个小的二进制字符串的开头0,使二进制字符串的位数相同。 这样,在XOR运算期间,两个字符串在一个周期内同时被遍历。如果对应的二进制不同,则在结果字符串result的末尾加1,否则在加0时遍历result result,最后输出。如果遇到第一个有效数据,当前(去掉前导0) defx或(string1,string2): 对两个二进制字符串进行异或,如果不同1 result= #输入数据处理iflen(string1) len (string2):)前者的位数不足以补足string 1的第一位0 string 1= 0 string 1 iflen(string 1)len(string 1)string 1):#如果后者的位数不足, 它是for iinrange(len(string 1)-len(string 1)-len相对于string 2 0 string 2= 0 string 2 # # print(string 1,2)# iinrange(len(string 1))3360 if string 1=string 2[I]:# Result= 1 else:Result= 0 # # print(Result)# iinrange(len)Result的输出数据处理:returnresult是一个CRC函数,它使用新变量lcddkh_expression保存生成多项式的二进制列计算时,必须首先在数据字符串的末尾添加指定数量的零。0的个数等于多项式的最大平方。因为将多项式转换成二进制数会增加一位,所以增加的零个数是len(lcddkh_expression(-1))。遍历二进制数据,将数据串的每个字符加到XOR结果串crc中,然后相加。

  r函数,并将结果返回给crc。因为生成校验码的过程中会删除前导零,所以需要补零(正常情况下不需要删除多余的零,只是为了保险起见才添加的)。def crc(string,Expression): 生成crc校验码 crc= #最终CRC校验码#输入数据处理lcddkh _ Expression=turn bin(Expression)#转换为范围内I的二进制字符串(len(lcddkh _ Expression)-1):# 0 string= 0 # # print(string,Lddkh _ expression) #范围内I的CRC计算(len(string)): #遍历被除数二进制字符串CRC=string[I]if len(CRC)==len(lcddkh _ Expression):# CRC=XOR(CRC, Lddkh _ expression) # # print (crc) #输出数据处理iflen(crc)len(lcddkh _ expression)-1:# for I in range(len(lcddkh _ expression)-len(CRC)):# Add 0 CRC= 0 CRC if len(CRC)len(lcddkh _ expression)-1:#当CRC位过多时,CRC=CRC[len(CRC)-len(lcddkh _ expression)1:]# slice,去掉头中多余的0 return crc。 在检查CRC的步骤中,使用先前的CRC函数。传入的生成多项式也需要进行二进制转换,传入的二进制字符串数据的末尾就是对应的校验码。计算crc校验码时,切片范围为[0,len(string)-len(lcddkh _ expression)1]。计算校验码后,将计算出的CRC与原始数据的right_crc进行比较。如果两个校验码相同,说明数据传输正常。如果两个校验码不一样,说明数据传输有错误。检查crc (string,expression): #检查传输的数据是否正确,并打印结果#输入数据处理lcddkh _ expression=turn bin(expression) #转换为二进制字符串right _ CRC=string[len(string)-len(lcddkh _ expression)1:]#原始数据末尾的CRC校验码#计算CRC=CRC(string[:len(string)-len(lcddkh _ expression)1:],expression)#检查是否right_crc==crc: #当CRC校验码末尾,当一致.)else: print(数据传输过程错误.)print(检测到的校验码:,crc) print(数据尾校验码:,right_crc)其余代码属于主函数中接口的设计部分,就不详细介绍了。

  第三,代码

  然后,改变二进制数据的一些位,在数据末尾添加由原始数据生成的CRC校验码进行检测。

  将相应的CRC校验码添加到原始数据中进行检测。

  # 作者:小狐狸# 题目:CRC循环冗余校验def TurnBin(表达式): 将生成多项式转换为二进制字符串输出 #输入数据处理expression=expression.upper() #大写转换lis=list(表达式。拆分())#以加号为标志进行分割string=lis[-1] #多项式末尾的数字1 del lis[-1] lis=lis[:-1] #倒序##打印(lis) #二进制转换对于范围内的I(len(lis)):if len(string)==int(lis[I][1]):#满足位数与变量的数字相同时string= 1 else:for j in range(int(lis[I][1])-len(string)):#用0补全相差的位数字符串=“0”字符串=“1”返回字符串[:-1]def XOR(string1,string2): 将两个二进制串进行异或操作,不同为1 结果= #输入数据处理if len(string1)len(string2): #若前者的位数不足时对于范围内的I(len(字符串2)-len(字符串1)):#对字符串一的首位补0 string 1= 0 string 1 if len(string 1)len(string 2):#若后者的位数不足时对于范围内的I(len(字符串1)-len(字符串2)):#对字符串2的首位补0字符串2= 0 字符串2 # # print(string 1,string2) #异或计算for I in range(len(string 1)):if string 1[I]!=string 2[I]:result= 1 else:result= 0 # # print(result)#输出数据处理对于范围内的I(len(结果)):#消除异或结果中的无效0 if result[i]==1: #找到第一个有效数据时返回结果[I:]返回结果定义CRC(字符串,表达式): 产生循环冗余检验校验码 crc= #最终的循环冗余码校验校验码#输入数据处理lcddkh _ expression=turn bin(expression)#转换为二进制串对于范围内的I(len(lcddkh _ expression)-1):#在二进制串末尾补0 string=0## print(string,lcddkh_expression) #CRC计算对于范围内的I(len(string)):#遍历被除数二进制串CRC=string[I]if len(CRC)==len(lcddkh _ expression):#当位数足够异或计算时crc=XOR(crc,lcddkh _ expression)# # print(CRC)#输出数据处理if len(CRC)len(lcddkh _ expression)-1:#当循环冗余码校验位数不足时对于范围内的I(len(lcddkh _ expression)-len(CRC)):#在首部补0 CRC= 0 CRC if len(CRC)len(lcddkh _ expression)-1:#当循环冗余码校验位数过多时CRC=CRC[len(CRC)-len(lcddkh _ expression)1:]#切片,消除首部多余的0返回crc def CheckCRC(字符串,表达式):#检测传输数据是否正确,并打印结果#输入数据处理lcddkh _ expression=turn bin(expression)#转换为二进制串right _ CRC=string[len(string)-len(lcddkh _ expression)1:]#原数据末尾的循环冗余码校验校验码#CRC计算CRC=CRC(string[:len(string)-len(lcddkh _ expression)1:],expression) #检验if right_crc==crc: #当尾部的循环冗余检验校验码,与首部数据生成的循环冗余检验校验码一致时打印(数据传输过程正常.)else: print(数据传输过程出错.)打印(检测出的校验码:,crc)打印(数据尾部校验码:,right _ CRC)if _ _ name _ _= _ _ main _ _ :while True:print(-)print( 0 .退出 )打印( 1。产生循环冗余检验校验码 )打印( 2。检测传输数据 )print(-)flag=int(input())if flag==0:break elif flag==1:expression=input(生成多项式:)string=input(二进制串:)打印(字符串,的循环冗余检验校验码为: ,CRC(string,expression))elif flag==2:expression=input(生成多项式:)string=input(二进制串:)CheckCRC(字符串,表达式)打印(程序已终止.)

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: