"""
|
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])
|