1. 程序的功能
可解析大于64KB的HEX文件。限于时间条件,笔者只测试了两个样例,数据域大小分别为8332B和1.61MB
将解析得到的结果打印出来,包括:
- 起始地址
- 末尾地址
- 数据域尺寸(单位:字节)
保存数据域的内容为bin文件以便查验和后续处理
2. 程序解读
HEX文件解析,相关函数:hex2bin()
考虑到HEX文件通常不会很大,所以一次性读取全部内容,每1行为1个list,然后逐行分析
通过识别每1行的TT字段来执行相应的操作,流程图如下:
(1)数据打包
相关函数:char2hex()
通过readlines函数读取到的是一行行字符串,如第一行是“:020000040800F2”,此外末尾还包含一个不可见的回车符号。
我们要将数字字符转换成对应的整型数据以便运算和存储,行首的冒号和行尾的回车符仅用于格式判断,对于数据提取是无用的,故去除。
HEX格式定义中的记录域是以字节为最小单位的,所以还需要将两个整型字符拼成1个字节。
python提供的高阶函数map()和切片操作,极大地方便了我们对HEX文本进行信息提取和格式转换。
char2hex()函数最终返回的是如下形式的整型列表:[0x02,0x00,0x00,0x04,0x08,0x00,0xF2]
(2)校验和
相关函数:checksum()
得到了1行数据的整型列表以后,最好对该行数据校验一下。
按照规定,每行记录的倒数第1个字节是校验和(Checksum),校验算法为:
0x100-((除了冒号以外的所有数据以字节为单位相加)%256)
笔者的代码实现如下:sum = (0x100 - (reduce(lambda x,y:x+y,line[:-1]) % 256)) % 256
之所以最后要再对256取模,是考虑到算出来的结果正好为0x100的情况,在C语言里,不做这一步当然OK,因为C语言中数据类型有自身的固定长度,
超出长度的高位部分会自动截断,对于8位无符号数,0x100==0x0