大家好,欢迎来到IT知识分享网。
1.checksum是什么?
2.计算方法
3.算法实现的具体思路
参考的别的大佬的文章,数据拿过来
45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d
1、第一步,checksum数据中的checksum=b52e设为0
遍历需要校验的数据,将checksum替换为0
45 00 00 30 80 4c 40 00 80 06 00 00 d3 43 11 7b cb 51 15 3d
2、第二步,求和
遍历求和,直接累加,最后输出的是一个int类型的十进制数
3、第三步,转十六进制,将进位添加到低位
python提供了直接将十进制数转为十六进制的内置函数:hex() 返回的是str型 例如:hex(12345)
4500+0030+804c+4000+8006+0000+d343+117b+cb51+153d=0x34ace
将进位(3)加到低16位(4ace)上:0003+4ace=4ad1
4、使用python实现checksum算法
代码没有整理简化,
''' 自定义checksum算法实现 checksum:校验和 data:需要校验的数据 ''' import math import numpy as np class myCheckSum(): def __init__( self,checkSum,data=[] ): self.checkSum=checkSum self.data=data self.hexadecimal={ 'a':10, 'b':11, 'c':12, 'd':13, 'e':14, 'f':15, 10:'a', 11:'b', 12:'c', 13:'d', 14:'e', 15:'f'} # 十六进制大于9的数 self.sumdata=0x0 #第一步,求和(遍历时遇到checksum,替换为0x0) datas=self.sumCheckSum() #第二步,将进位加到低位 cal=self.carryAddLow( len(self.sumdata),datas ) # len(self.sumdata)=5 cal=0x4ad1 #第三步,取补码 result=self.complementData(cal) print('result:',result) print('checksum:',checkSum) # checkSum: 46382 if result==checkSum: print('True:正确') else: print('False:错误') # 求和 def sumCheckSum(self): dataLen=len(self.data) for i in range(dataLen): if self.data[i]==self.checkSum: # 找到checksum self.sumdata+=0x0 # checksum替换为0x0来累加 else: self.sumdata+=self.data[i] #print( type( sel.SumData ) ) # <class 'int'> int型 self.sumdata=hex(self.sumdata)[2:] # '0x34ace' str类型 十六进制 datas=[] for i in self.sumdata: if i in ['a','b','c','d','e']: datas.append( self.hexadecimal[i] ) else: datas.append( int(i) ) #print( 'datas:',datas) # ['3','4','10','12','14'] return datas # 取反 ,这里取反取的是补码 在python中 ~ 不能取到补码 def complementData(self,cal): tenResult=int(cal,16) twoResult=bin(tenResult) calLen=len( cal[2:]) # 4 twoResultLen=len( twoResult[2:]) # 15 if calLen*4>twoResultLen: subLen=calLen*4-twoResultLen # 1 twoResult='0'*subLen+twoResult[2:] #print( 'twoResult:',twoResult ,'*type:',type(twoResult)) # twoResult: 00001 *type: <class 'str'> reverseResult='0b' for i in twoResult: if i=='1': reverseResult+='0' else: reverseResult+='1' #print('reverseResult:',reverseResult) # reverseResult: 0b01110 #print(hex( eval(reverseResult) ) ) # 0xb52e return eval(reverseResult) # 46382 十进制 # 进位加到低位 返回一个十六进制数 # 将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff, 再将新值的高16bit与低16bit相加; def carryAddLow(self,sumDataLen,datas): # sumDataLen=5 判断是否大于0Xffff,一种直接数值判断,另一种长度大于0Xffff的四位 bus,rem=divmod(sumDataLen,4) # 取bus商 rem余数 dualLists=[] if rem != 0: for i in range(bus+1): # 如果有余数 bus需要+1 dualLists.append([]) # dualLists=[ [], [], []] if i==0: # 第一个list为 [0,0,0,3] for j in range(4-rem): dualLists[i].append(0) for j in range(rem): dualLists[i].append( datas[0] ) del datas[0] else: for j in range(4): dualLists[i].append( datas[0] ) del datas[0] else: for i in range(bus): dualLists.append([]) for j in range(4): dualLists[i].append( datas[0] ) del datas[0] #print( 'dualLists:',dualLists) # dualLists: [[0, 0, 0, 3], [4, 10, 12, 14]] res=[0,0,0,0] for i in range( len(dualLists)): res=np.array(res)+np.array( dualLists[i] ) # 使用numpy中array把两个list相加 #print('res:',res) # res: [ 4 10 12 17] 到这里进位加到低位结束 result=[] for i in range( len(res)-1,-1,-1 ): # 逆序遍历res if res[i]>15: # 大于15的进位 小于等于的直接存了 result.append( res[i]%16 ) res[i-1]+=res[i]//15 else: result.append( res[i] ) #print('result:',result) data='0x' for i in range( len(result)-1,-1,-1 ): if result[i] in [10,11,12,13,14,15]: data+=self.hexadecimal[ result[i] ] else: data+=str( result[i] ) #print('data:',data) # 4ad1 return data
验证一下
(1)反码求和
(2)取反码:~ffff=0 正确
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/139444.html