python fromhex长度问题_任意长度HEX文件的解析(Python实现)

本文介绍了一个Python程序,能解析大于64KB的HEX文件,包括数据域的起始地址、末尾地址和尺寸。程序通过逐行分析HEX文件,进行数据打包、校验和计算,并将数据保存为bin文件。代码中包含hex2bin()、char2hex()和checksum()等关键函数,实现了对STM32工程生成的HEX文件的正确解析。
摘要由CSDN通过智能技术生成

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

### 回答1: 可以使用Python的binascii模块来实现hex文件转bin文件的功能。具体的实现方法可以参考以下代码: ```python import binascii with open('input.hex', 'r') as f: hex_data = f.read() bin_data = binascii.unhexlify(hex_data) with open('output.bin', 'wb') as f: f.write(bin_data) ``` 其中,'input.hex'是需要转换的hex文件名,'output.bin'是转换后的bin文件名。使用with语句可以自动关闭文件,避免文件句柄泄漏的问题。 ### 回答2: Python可以使用以下代码将hex文件转换为bin文件: ```python def hex_to_bin(hex_file, bin_file): with open(hex_file, 'r') as f_hex, open(bin_file, 'wb') as f_bin: for line in f_hex: line = line.strip() if line and line[0] == ':': data = bytes.fromhex(line[1:]) f_bin.write(data) # 示例调用 hex_to_bin('example.hex', 'example.bin') ``` 这段代码定义了一个`hex_to_bin`函数,该函数接受两个参数:`hex_file`代表输入的hex文件路径,`bin_file`代表输出的bin文件路径。代码使用了Python文件操作和字节操作方法。 函数首先打开hex文件和bin文件,然后通过读取hex文件的每一行,判断是否为数据行(以冒号开头)。如果是数据行,则从每一行获取数据部分,并使用`bytes.fromhex`方法将hex字符串转换为字节数据,最后将字节数据写入bin文件。 你可以将需要转换的hex文件路径和输出的bin文件路径作为示例调用函数的参数,这样就可以将hex文件转换为bin文件了。 ### 回答3: 要将hex文件转换为bin文件,可以使用Python中的binascii模块。下面是一个简单的示例代码: ```python import binascii def hex_to_bin(hex_file, bin_file): try: with open(hex_file, 'r') as f: hex_data = f.read().replace('\n', '') bin_data = binascii.unhexlify(hex_data) with open(bin_file, 'wb') as f: f.write(bin_data) print("转换成功!") except Exception as e: print("转换失败:", str(e)) # 以hex_file为输入,bin_file为输出,调用hex_to_bin函数 hex_to_bin("input.hex", "output.bin") ``` 此代码中,使用`with open`语句打开hex文件,并读取其中的内容。然后,使用`binascii.unhexlify`函数将hex文件中的十六进制数据转换为二进制数据。最后,将二进制数据写入指定的bin文件中。 要使用这个示例代码,只需将`hex_file`和`bin_file`参数替换为实际的文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值