pyChecknum.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import shutil
  5. import argparse
  6. import binascii
  7. def calChecknum(type="sum32", datas=[]):
  8. if type == "sum32":
  9. return sum(datas)
  10. elif type == "crc32":
  11. return binascii.crc32(datas)
  12. else:
  13. print("unKown type: "+type)
  14. return datas
  15. #查看文件后的16进制数据
  16. def ReadBinFile(in_file, type="sum32", en='little', block_size=1024):
  17. filename, file_type = os.path.splitext(in_file)
  18. checknum_bytes = None
  19. out_name0 = filename+file_type+"."+type
  20. f = open(in_file, "rb")
  21. o = open(out_name0, "wb+")
  22. if f and o: #二进制打开文件
  23. # 1.计算和写入分片校验码
  24. if block_size:
  25. while True:
  26. # 读一块
  27. datas = f.read(block_size)
  28. if len(datas) == 0:
  29. break
  30. # 这一块的checknum
  31. checknum = calChecknum(type, datas)
  32. checknum_bytes = checknum.to_bytes(4, en) #"little", "big" # 大端序
  33. # 写入数据和checknum
  34. o.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
  35. o.write(datas)
  36. o.write(bytes(checknum_bytes))
  37. else:
  38. shutil.copy(in_file, out_name0)
  39. # 2.计算原始文件校验码
  40. f.seek(0,0)
  41. datas = f.read()
  42. checknum_all = calChecknum(type, datas)
  43. f.close()
  44. o.close()
  45. # 3.写入原始文件校验码
  46. checknum_all_bytes = checknum_all.to_bytes(4, en) #"little", "big" # 大端序
  47. print(in_file, os.path.getsize(in_file), type, checknum_all_bytes.hex())
  48. # 输出文件名
  49. out_name1 = filename+file_type+"."+type+"["+checknum_all_bytes.hex()+"]"
  50. shutil.move(out_name0, out_name1)
  51. # 追加到文件最后
  52. with open(out_name1, "rb+") as f:
  53. f.seek(0,2) #位移到最后 SEEK_END(值为2) SEEK_CUR(值为1) SEEK_SET(值为0)
  54. f.write(bytes(checknum_all_bytes))
  55. f.close()
  56. if __name__ == "__main__":
  57. parser = argparse.ArgumentParser()
  58. parser.add_argument("n", help="bin文件名,譬如 COAB21232D.bin")
  59. parser.add_argument("-t", help="校验方式:sum32,crc32, 默认sum32")
  60. parser.add_argument("-e", help="校验码大小端:little,big, 默认little")
  61. parser.add_argument("-s", help="分块大小:0,1024,2048, 默认0不分块")
  62. args = parser.parse_args()
  63. project = str(args.n)
  64. type = "sum32" #默认 累加和
  65. en = "little" #默认 checknum 小端
  66. block_size = 0 #默认 0
  67. if args.t:
  68. type = str(args.t)
  69. if args.e:
  70. en = str(args.e)
  71. if args.s:
  72. block_size = int(args.s)
  73. # print(project, type, en)
  74. ReadBinFile(project, type, en, block_size)