日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

checksum算法详细的计算方法、实现思路与python校验验证

發布時間:2024/3/24 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 checksum算法详细的计算方法、实现思路与python校验验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.checksum是什么?

Checksum:【電腦】總和檢驗碼,校驗和。在數據處理和數據通信領域中,用于校驗目的的一組數據項的和。這些數據項可以是數字或在計算檢驗總和過程中看作數字的其它字符串。
它通常是以十六進制為數制表示的形式
通常用來在通信中,尤其是遠距離通信中保證數據的完整性和準確性


2.計算方法

1、 先將需要計算checksum數據中的checksum設為0;
2、 計算checksum的數據按2byte劃分開來,每2byte組成一個16bit的值,如果最后有單個byte的數據,補一個byte的0組成2byte;
3、 將所有的16bit值累加到一個32bit的值中;
4、 將32bit值的高16bit與低16bit相加到一個新的32bit值中,若新的32bit值大于0Xffff,
再將新值的高16bit與低16bit相加;
5、 將上一步計算所得的16bit值按位取反(取反是取補碼),即得到checksum值,存入數據的checksum字段即可。


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、第四步,取反碼
?將4ad1取反得:checksum=b52e


4、使用python實現checksum算法

代碼沒有整理簡化,

''' 自定義checksum算法實現checksum:校驗和 data:需要校驗的數據 ''' import math import numpy as npclass myCheckSum():def __init__( self,checkSum,data=[] ):self.checkSum=checkSumself.data=dataself.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: 46382if 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: # 找到checksumself.sumdata+=0x0 # checksum替換為0x0來累加else:self.sumdata+=self.data[i]#print( type( sel.SumData ) ) # 215758 <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:]) # 4twoResultLen=len( twoResult[2:]) # 15 if calLen*4>twoResultLen:subLen=calLen*4-twoResultLen # 1twoResult='0'*subLen+twoResult[2:]#print( 'twoResult:',twoResult ,'*type:',type(twoResult)) # twoResult: 0100101011010001 *type: <class 'str'>reverseResult='0b'for i in twoResult:if i=='1':reverseResult+='0'else:reverseResult+='1'#print('reverseResult:',reverseResult) # reverseResult: 0b1011010100101110#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需要+1dualLists.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 ): # 逆序遍歷resif 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)反碼求和

4500+0030+804c+4000+8006+b52e+d343+117b+cb51+153d=3fffc
0003+fffc=ffff

(2)取反碼:~ffff=0 正確

總結

以上是生活随笔為你收集整理的checksum算法详细的计算方法、实现思路与python校验验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。