有时候我们需要计算bin文件的CRC值,比如OTA的固件(我们升级程序前,需要校验OTA固件的CRC值,判断固件数据是否正确)。这里给出一个简单的python脚本,用于计算bin文件的CRC32值,需要说明的是:这里的bin文件默认有4个字节的区域为0(偏移地址0x0000001c),用于存放计算后的CRC32值。
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import binascii
import os
import sys
def crc2hex(crc):
res=''
for i in range(4):
t=crc & 0xFF
crc >>= 8
res='%02X%s' % (t, res)
return res
inputfile = "/data/test.bin"#实际存放的bin文件路径
isfile = os.path.isfile(inputfile);
print(inputfile);
fp = open(inputfile, "r+b") #直接打开一个文件,如果文件不存在则创建文件
filesize = os.path.getsize(inputfile)
print("ZI app firmware size:", filesize, "bytes.")
#计算bin文件的CRC,首先清空CRC32区域的4个byte
fp.seek(0x1c, 0)#从bin文件开始,偏移地址为0x1c的地方存放bin的CRC32
clear4bytes = '00000000'
c4 =binascii.unhexlify(clear4bytes)
fp.write(c4) #将CRC32存放的区域4bytes清零
fp.seek(0, 0)#从0开始读取整个bin
file_content = fp.read()#读整个文件内容到 file_content
crc = binascii.crc32(file_content)
print('CRC32:', hex(crc))
fp.seek(0x1c, 0)#从bin文件开始,偏移地址为0x1c的地方存放bin的CRC32
#存放计算CRC32四个字节
crcstr_2 = crc2hex(crc)
r=binascii.unhexlify(crcstr_2)
fp.write(r)
fp.close()
sys.exit(0)##正常退出
计算bin文件crc32主要用到python模块binascii,详细接口说明可以参考文档:https://docs.python.org/2/library/binascii.html。
运行
python CRC.py
网上有许多在线计算文件CRC、MD5、SHA1等值的小工具,这里推荐一个比较好用的网站:
http://tools.jareye.com/crypto/fileverify.html
校验结果
与脚本计算的结果一致。