1. 程式人生 > >python 計算Intel HEX檔案 HEX記錄校驗和

python 計算Intel HEX檔案 HEX記錄校驗和

簡單的說:
英特爾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