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