tao_z
2022-08-23 989919a73c5ebd46368991b6c3ff6959e32490b6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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])