前言:
在项目中,每次发布Flash的镜像文件之后,bin文件都比较大。为了使产线和OTA升级使用同一个文件,且为了OTA升级时间相对较短,需要将bin文件缩小。
bin文件分析
bin文件后面包含大量无效数据“0xFF”
代码:
import os
import time
import struct
if __name__ == '__main__':
file = "flash.bin"
file_size = os.path.getsize(file)
print("FileSize: %08X" % (file_size))
fd = open(file, mode="rb")
# 方式1:从文件尾开始读起,当二进制判断不为0xFF时,输出偏移量
file_offset = file_size
bin_data = 0xFF
fd.seek(0, 0)
start_time = time.time()
while ((bin_data == 0xFF) and (file_offset > 0)):
file_offset -= 1
fd.seek(file_offset, 0)
bin_steam = fd.read(1)
bin_data = struct.unpack("B", bin_steam)[0]
end_time = time.time()
print("Running Done, Running Time: %ds" % (end_time - start_time))
print("FileOffset: %08X" % (file_offset))
# 方式2:从文件头开始读起,记录二进制不为0xFF偏移量,直到整个文件读取完成,再输出偏移量
file_cnt = 0
file_offset = 0
fd.seek(0, 0)
start_time = time.time()
while (file_cnt < file_size):
bin_steam = fd.read(1)
bin_data = struct.unpack("B", bin_steam)[0]
if (bin_data != 0xFF):
file_offset = file_cnt
file_cnt += 1
end_time = time.time()
print("Running Done, Running Time: %ds" % (end_time - start_time))
print("FileOffset: %08X" % (file_offset))
fd.close()
运行条件:
“flash.bin”为8M的Flash镜像文件
运行结果如下:
FileSize: 00800000
Running Done, Running Time: 27s
FileOffset: 001359EF
Running Done, Running Time: 4s
FileOffset: 001359EF
总结:
Python的seek函数耗时较长,不易频繁使用,建议文本操作时将数据从头读到尾