python 計算Intel HEX檔案 HEX記錄校驗和
阿新 • • 發佈:2018-12-21
簡單的說:
英特爾HEX檔案由任意數量的資料記錄組成,這些資料記錄以回車符和換行符結束。
例如資料記錄如下:10246200464C5549442050524F46494C4500464C33
該記錄解碼如下:
10是記錄中的資料位元組數。
2462是資料在儲存器中的地址。
00是記錄型別00(資料記錄)。
464C … 464C是資料。
33是記錄的校驗和。
校驗和如何計算?
校驗和的計算方法是將記錄中所有十六進位制數字對的值相加模256(0x100)並取補碼。
例如:
10246200464C5549442050524F46494C4500464C的校驗碼計算為:
0x256-(0x10+0x24+0x62+0x00+0x4c+…+0x46+0x4c)mod(0x256)
或:
100-(10+24+62+00+4c+…+46+4c)mod 100
mod運算即取餘運算(%),例如:
150mod100=50;
3mod5=3;
5mod3=2;
看,對吧,其實很簡單!
我就直接附上python程式碼極其程式碼說明吧
def check(DD): length=len(DD) #求長度 #建立一個list,將傳入的str的每兩個數合在一起,再求和 list1=[] if(length%2==1): #如果str長度為單數,則丟擲錯誤 print('[!] 資料長度有誤') else: for i in range(0, length, 2): #range(開始,結束-1,每次加多少) 這裡即0——length-1 每次迴圈i+2 hex_digit=DD[i:i + 2] #將傳入的str的每兩個數合在一起 list1.append('0x'+hex_digit) #再每個字元前+0x 但是它仍然是字元,但更便於下面通過int(list1[i], 16)轉換成16進位制 print(list1) sum=0 for i in range(int(length/2)): #求和 sum=int(list1[i], 16)+sum #int(list1[i], 16)將16進位制轉換成10進位制 int型別 sum=sum%256 sum=256-sum print('校驗碼: '+hex(sum)) #將sum和結果轉換成16進位制 hex(sum) if __name__=="__main__": DD=input("請輸入HEX檔案資料記錄(校驗值除外):") #input接收引數為str型別 check(DD)
再附上一個執行結果:
請輸入HEX檔案資料記錄(校驗值除外):1000B00053F021E30CD09FE501AB4DE208009FE5
['0x10', '0x00', '0xB0', '0x00', '0x53', '0xF0', '0x21', '0xE3', '0x0C', '0xD0', '0x9F', '0xE5', '0x01', '0xAB', '0x4D', '0xE2', '0x08', '0x00', '0x9F', '0xE5']
校驗碼: 0x32