From a1a1c89b91fc9476c51981699aaa7c2bccdd8570 Mon Sep 17 00:00:00 2001 From: tao_z <tzj0429@163.com> Date: Sun, 07 Aug 2022 14:19:02 +0800 Subject: [PATCH] SX7H初步完成 --- hexread.py | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 103 insertions(+), 0 deletions(-) diff --git a/hexread.py b/hexread.py new file mode 100644 index 0000000..250fb35 --- /dev/null +++ b/hexread.py @@ -0,0 +1,103 @@ +""" +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]) -- Gitblit v1.8.0