| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import os
- import shutil
- import argparse
- import struct
- import binascii
- def intToBytes(value, length):
- result = []
- for i in range(0, length):
- result.append(value >> (i * 8) & 0xff)
- result.reverse()
- return result
- #查看文件后的16进制数据
- def ReadBinFile(in_file, type="sum32", en='little', block_size=1024):
- filename, file_type = os.path.splitext(in_file)
- out_name = None
- checknum_bytes = None
- # 方式一:累加和
- if type == "sum32":
- out_name0 = filename+file_type+".sum32"
- f = open(in_file, "rb")
- o = open(out_name0, "wb+")
- if f and o: #二进制打开文件
- checknum_all = 0
- if block_size:
- while True:
- # 读一块
- datas = f.read(block_size)
- if len(datas) == 0:
- break
- # 这一块的checknum
- checknum = 0
- for j in range(len(datas)):
- checknum += datas[0]
- checknum_all += datas[0] # 总文件的checknum
- checknum_bytes = checknum.to_bytes(4, en) #"little", "big" # 大端序
- # 写入数据和checknum
- o.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
- o.write(datas)
- o.write(bytes(checknum_bytes))
- else:
- while True:
- datas = f.read(1)
- if len(datas) == 0:
- break
- checknum_all += datas[0] # 总文件的checknum
- o.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
- o.write(datas)
- f.close()
- o.close()
- checknum_all_bytes = checknum_all.to_bytes(4, en) #"little", "big" # 大端序
- checknum_all_str = checknum_all_bytes.hex()
- print(in_file, os.path.getsize(in_file), "checknum", checknum_all_str)
- # 输出文件名
- out_name1 = filename+file_type+".sum32["+checknum_all_str+"]"
- shutil.move(out_name0, out_name1)
- # 追加到文件最后
- with open(out_name1, "rb+") as f:
- f.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
- f.write(bytes(checknum_all_bytes))
- f.close()
- elif type == "crc32":
- # 方式2:crc32
- out_name0 = filename+file_type+".crc32"
- f = open(in_file, "rb")
- o = open(out_name0, "wb+")
- if f and o: #二进制打开文件
- checknum_all = 0
- if block_size:
- while True:
- # 读一块
- datas = f.read(block_size)
- if len(datas) == 0:
- break
- # 这一块的checknum
- checknum = binascii.crc32(datas)
- checknum_bytes = checknum.to_bytes(4, en) #"little", "big" # 大端序
- # 写入数据和checknum
- o.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
- o.write(datas)
- o.write(bytes(checknum_bytes))
- else:
- datas = f.read()
- o.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
- o.write(datas)
- f.seek(0,0)
- datas = f.read()
- checknum_all = binascii.crc32(datas)
- f.close()
- o.close()
- checknum_all_bytes = checknum_all.to_bytes(4, en) #"little", "big" # 大端序
- checknum_all_str = checknum_all_bytes.hex()
- print(in_file, os.path.getsize(in_file), "checknum", checknum_all_str)
- # 输出文件名
- out_name1 = filename+file_type+".crc32["+checknum_all_str+"]"
- shutil.move(out_name0, out_name1)
- # 追加到文件最后
- with open(out_name1, "rb+") as f:
- f.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
- f.write(bytes(checknum_all_bytes))
- f.close()
- if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument("n", help="bin文件名,譬如 COAB21232D.bin")
- parser.add_argument("-t", help="校验方式:sum32,crc32, 默认sum32")
- parser.add_argument("-e", help="校验码大小端:little,big, 默认little")
- parser.add_argument("-s", help="分块大小:0,1024,2048, 默认0不分块")
- args = parser.parse_args()
- project = str(args.n)
- type = "sum32" #默认 累加和
- en = "little" #默认 checknum 小端
- block_size = 0 #默认 0
- if args.t:
- type = str(args.t)
- if args.e:
- en = str(args.e)
- if args.s:
- block_size = int(args.s)
- # print(project, type, en)
- ReadBinFile(project, type, en, block_size)
|