""" HEX格式文件以行为单位记录数据,每行都由任意数量的十六进制数组成。 每一行的格式如下: :本行数据长度(2byte)+数据起始地址(4byte)+数据类型(2byte)+数据内容(N byte)+校验(1byte) """ from aenum import IntEnum import binascii HEX_LEN_H = 1 HEX_LEN_L = 2 HEX_ADDR_HH = 3 HEX_ADDR_HL = 4 HEX_ADDR_LH = 5 HEX_ADDR_LL = 6 HEX_DATA_TYPE_H = 7 HEX_DATA_TYPE_L = 8 HEX_DATA_START = 9 HexTable = { 48: 0, 49: 1, 50: 2, 51: 3, 52: 4, 53: 5, 54: 6, 55: 7, 56: 8, 57: 9, 65: 10, 66: 11, 67: 12, 68: 13, 69: 14, 70: 15 } class HexDataType(IntEnum): DataRecord = 0 FileEnd = 1 ExtentionAddr = 2 StartSectionAddr = 3 ExtentionLinearAddr = 4 StartLinearSectionAddr = 3 class Hex_read(object): def __init__(self): self.start_addr = 0 self.len = 0 self.data = b'' def Open_file(self, file): self.file = file self.start_addr = 0 self.len = 0 self.data = b'' with open(file, 'rb') as fd: for aLineData in fd: if aLineData[0] == 0x3A: # 0x3A == ":" # print(aLineData) DataLen = HexTable[aLineData[HEX_LEN_H]] * 16 + HexTable[ aLineData[HEX_LEN_L]] Data_Addr = HexTable[ aLineData[HEX_ADDR_HH]] * 16 * 16 * 16 + HexTable[ aLineData[HEX_ADDR_HL]] * 16 * 16 + HexTable[ aLineData[HEX_ADDR_LH]] * 16 + HexTable[ aLineData[HEX_ADDR_LL]] Data_Type = HexTable[ aLineData[HEX_DATA_TYPE_H]] * 16 + HexTable[ aLineData[HEX_DATA_TYPE_L]] if Data_Type == HexDataType.FileEnd: break if Data_Type == HexDataType.ExtentionLinearAddr: self.start_addr = HexTable[aLineData[ HEX_DATA_START]] << 28 | HexTable[aLineData[ HEX_DATA_START + 1]] << 20 | HexTable[ aLineData[HEX_DATA_START + 2]] << 12 | HexTable[aLineData[ HEX_DATA_START + 3]] << 4 # print(self.start_addr) if Data_Type == HexDataType.DataRecord: if self.len == 0: self.start_addr += Data_Addr self.len += DataLen self.data += aLineData[HEX_DATA_START:HEX_DATA_START + DataLen * 2] fd.close() self.data = binascii.a2b_hex(self.data) # print(len(self.data)) # print(self.start_addr) # print(bin_file[0:20])