利用Python計算單片機bin文件的CRC32值


有時候我們需要計算bin文件的CRC值,比如OTA的固件(我們升級程序前,需要校驗OTA固件的CRC值,判斷固件數據是否正確)。這里給出一個簡單的python腳本,用於計算bin文件的CRC32值,需要說明的是:這里的bin文件默認有4個字節的區域為0(偏移地址0x0000001c),用於存放計算后的CRC32值。

cac_crc32_pyscript:

 1 # -*- coding:utf-8 -*-
 2 import binascii
 3 import os
 4 import sys
 5 
 6 def crc2hex(crc):
 7     res=''
 8     for i in range(4):
 9         t=crc & 0xFF
10         crc >>= 8
11         res='%02X%s' % (t, res)
12     return res
13 
14 inputfile = "E:/Telink BLE/.../826x_zi_app.bin"#實際存放的bin文件路徑
15 isfile = os.path.isfile(inputfile);
16 print(inputfile);
17 
18 fp = open(inputfile, "r+b")  #直接打開一個文件,如果文件不存在則創建文件
19 filesize = os.path.getsize(inputfile)
20 print("ZI app firmware size:", filesize, "bytes.")
21 
22 #計算bin文件的CRC,首先清空CRC32區域的4個byte
23 fp.seek(0x1c, 0)#從bin文件開始,偏移地址為0x1c的地方存放bin的CRC32
24 clear4bytes = '00000000'
25 c4 =binascii.unhexlify(clear4bytes)
26 fp.write(c4)  #將CRC32存放的區域4bytes清零
27 fp.seek(0, 0)#從0開始讀取整個bin
28 file_content = fp.read()#讀整個文件內容到 file_content
29 crc = binascii.crc32(file_content)
30 print('CRC32:', hex(crc))
31 
32 fp.seek(0x1c, 0)#從bin文件開始,偏移地址為0x1c的地方存放bin的CRC32 
33 #存放計算CRC32四個字節
34 crcstr_2 = crc2hex(crc)    
35 r=binascii.unhexlify(crcstr_2)  
36 fp.write(r)
37 fp.close()
38 
39 sys.exit(0)##正常退出

計算bin文件crc32主要用到python模塊binascii,詳細接口說明可以參考文檔:https://docs.python.org/2/library/binascii.html

windows運行cmd,輸入python “cac_crc32_pyscript.py”,按回車鍵運行結果如下:

網上有許多在線計算文件CRC、MD5、SHA1等值的小工具,這里推薦一個比較好用的網站:http://www.atool.org/file_hash.php可以直接把固件拖放到該網站,和python腳本計算的結果比較:

可以看出兩個方式的結果計算一致,心里有底。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM