pyChecknum.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import shutil
  5. import argparse
  6. import struct
  7. import binascii
  8. def intToBytes(value, length):
  9. result = []
  10. for i in range(0, length):
  11. result.append(value >> (i * 8) & 0xff)
  12. result.reverse()
  13. return result
  14. #查看文件后的16进制数据
  15. def ReadBinFile(in_file, type="sum32", en='little'):
  16. get_checknum = None
  17. filename, file_type = os.path.splitext(in_file)
  18. out_name = None
  19. checknum_bytes = None
  20. # 方式一:累加和
  21. if type == "sum32":
  22. with open(in_file, "rb") as f: #二进制打开文件
  23. size =os.path.getsize(in_file) #获取文件大小
  24. checknum = 0
  25. for i in range(size):
  26. datas = f.read(1)
  27. checknum += datas[0]
  28. f.close()
  29. get_checknum = True
  30. # checknum_str = '{:08X}'.format(checknum)
  31. checknum_bytes = checknum.to_bytes(4, en) #"little", "big" # 大端序
  32. checknum_str = checknum_bytes.hex()
  33. print(in_file, size, "checknum", checknum_str)
  34. # 输出文件名
  35. out_name = filename+file_type+".sum32["+checknum_str+"]"
  36. shutil.copyfile(in_file, out_name)
  37. elif type == "crc32":
  38. # 方式2:crc32
  39. with open(in_file, "rb") as f: #二进制打开文件
  40. size =os.path.getsize(in_file) #获取文件大小
  41. filedata = f.read()
  42. checknum = binascii.crc32(filedata)
  43. checknum_bytes = checknum.to_bytes(4, en) #"little", "big" # 大端序
  44. # checknum_str = '{:08X}'.format(checknum)
  45. checknum_str = checknum_bytes.hex()
  46. print(in_file, size, "checknum", checknum_str)
  47. # 输出文件名
  48. out_name = filename+file_type+".crc32["+checknum_str+"]"
  49. shutil.copyfile(in_file, out_name)
  50. if out_name:
  51. # 追加到文件最后
  52. with open(out_name, "rb+") as f:
  53. f.seek(0,2) #位移到最后
  54. f.write(bytes(checknum_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. args = parser.parse_args()
  62. project = str(args.n)
  63. type = "sum32" #默认 累加和
  64. en = "little" #默认 checknum 小端
  65. if args.t:
  66. type = str(args.t)
  67. if args.e:
  68. en = str(args.e)
  69. # print(project, type, en)
  70. ReadBinFile(project, type, en)