Python hex 转换成bin | bin转换成hex

本文介绍了一个简单的Python脚本,用于实现Intel Hex格式文件与二进制Bin文件之间的相互转换。通过命令行调用该脚本,可以便捷地完成文件格式的转换。

使用方法:

新建文件hex2bin.py,将以下代码复制进去,新建binfile.bin、hexfile.hex文件,将需要转换的
hex内容替换hexfile.hex文件内容,三个文件保存在同一目录下,进入windows,cmd模式,切换
到hex2bin.py目录,运行"python hex2bin.py -b hexfile.hex binfile.bin"即可得到对应的bin文件。

# -*- coding:utf-8 -*-

import os
import sys
from struct import *

#intel-hex 格式
#:LLAAAARRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDZZ
#LL——长度,单位,byte
#AAAA——16 bit 地址
#RR——类型
# - 00 数据记录 (data record)
# - 01 结束记录 (end record)
# - 02 扩展段地址记录 (paragraph record)
# - 03 转移地址记录 (transfer address record)
# - 04 扩展线性地址记录 (expand address record)
#DD——16byte数据
#ZZ——校验

last_size = 0
last_addr = 0
cur_size  = 0
cur_addr  = 0
high_addr = 0
expand_f  = 0

#hex to bin
def hex_bin(hexfile,binfile):
	#declare global var
	global last_size
	global last_addr
	global cur_size
	global cur_addr
	global high_addr
	global expand_f
	fin = open(hexfile)
	fout = open(binfile,'wb')
	result =''
	#read every lines
	for hexstr in fin.readlines():
		#去空格\n\r\t
		# print hexstr
		hexstr = hexstr.strip()
		size = int(hexstr[1:3],16)
		#RR是数据
		if int(hexstr[7:9],16) == 0:
			#expand addr deal
			if expand_f == 1:
				cur_addr = int(hexstr[3:7],16)
				#data skipped
				need_wr_size = high_addr+cur_addr-(last_addr+last_size)
				if need_wr_size != 0:
					if need_wr_size > 1000:
						print ("skipped data too large !!!")
					else:
						result=''
						for dr in range(0,need_wr_size):
							#empty space write 0xff
							b = int("0xff",16)
							result = pack('B',b)
							fout.write(result)        
				expand_f = 0
			last_size = size
			last_addr = int(hexstr[3:7],16)

			for h in range(0, size):
				b = int(hexstr[(9+h*2):(9+h*2+2)],16)
				result += pack('B',b)
			#end if
			fout.write(result)
			result=''
		#RR是结束
		elif int(hexstr[7:9],16) == 1:
			end_f = 1
		#RR是扩展地址
		elif int(hexstr[7:9],16) == 4:
			high_addr = int(hexstr[9:13],16)
			if high_addr:
				expand_f = 1
			# print hexstr,hex(high_addr),expand_f
		#end if    
	#end for
	fin.close()
	fout.close()

# bin to hex
def bin_hex(binfile,hexfile):
	fbin = open(binfile,'rb')
	fhex = open(hexfile,'w')
	offset = 0
	seg_addr = 0
	while 1:
		checksum=0 
		result = ':'
		bindata = fbin.read(0x10)
		if len(bindata) == 0 :
			break
		#end if
		result += '%02X' % len(bindata)
		result += '%04X' % offset
		result += '00'
		checksum = len(bindata)
		checksum += (offset & 0xff) + (offset >> 8)

		for i in range(0,len(bindata)):
			byte = unpack('B',bindata[i])
			result+='%02X' % byte
			checksum += byte[0]
		#end for    
		checksum = 0x01 + ~checksum
		checksum = checksum & 0xff
		result += '%02X/n' % checksum 
		fhex.write(result)
		offset += len(bindata)
		if offset == 0x10000:
			offset = 0            
			seg_addr += 1
			result = ':02000004'
			result += '%02X%02X' % ((seg_addr>>8) & 0xff,seg_addr & 0xff)
			checksum = 0x02 + 0x04 + (seg_addr>>8) + seg_addr & 0xff            
			checksum = -checksum
			result+='%02X' % (checksum & 0xff)
			result += '/n'
			fhex.write(result)
		#end if    
		if len(bindata) < 0x10:
			break
		#end if    
	#end while    
	fhex.write(':00000001FF')
	fbin.close()
	fhex.close()
#end for

if len(sys.argv) != 4 or (sys.argv[1] != '-h' and sys.argv[1] != '-b'):
	print 'usage:'
	print 'convert binary format to hexadecimal format: '
	print ' hexbin.py -h binfile hexfile'
	print 'convert hexadecimal format to binary format:'
	print ' hexbin.py -b hexfile binfile'
	exit(0)

if sys.argv[1] == '-h':
	bin_hex(sys.argv[2],sys.argv[3])
else:
	hex_bin(sys.argv[2],sys.argv[3])


<think>好的,用户的问题是关于如何用PythonHEX文件转换BIN文件,需要示例代码或库。首先,我需要回忆一下之前用户提供的引用内容,特别是引用[1]中的代码示例,以及引用[2]和引用[3]中提到的HEXBIN文件的区别。 用户可能已经看过引用[1]中的代码,但可能希望得到更详细或优化的方法。我需要确保提供的代码正确处理HEX文件的记录结构,特别是地址信息。根据引用[2],HEX文件包含地址信息,而BIN文件只是纯数据,所以在转换时需要正确解析HEX记录中的地址,并将数据按正确的位置填充到BIN文件中。 首先,我需要检查示例代码是否有问题。原示例代码只是简单拼接所有数据,但实际应用中,HEX文件可能有不同的记录类型,如数据记录、扩展线性地址记录(用于大于64KB的地址)和文件结束记录。原代码可能没有处理这些情况,导致生成的BIN文件不正确,特别是当有地址间隙时,数据会被错误地连续写入,而忽略了地址偏移。 因此,正确的做法应该是解析每条HEX记录,处理扩展地址,并根据地址将数据填充到对应的位置。对于未覆盖的地址区域,可能需要填充默认值(如0xFF)。这样生成的BIN文件才能准确反映原始HEX文件的数据布局。 接下来,我需要编写一个更完善的Python函数,能够处理这些情况。可能需要使用第三方库如intelhex来简化处理,但用户可能希望不依赖外部库,所以需要提供一个手动解析的方法。 在代码中,需要逐行解析HEX文件,识别记录类型。对于数据记录(类型00)和扩展线性地址记录(类型04),更新当前的高位地址。然后根据地址将数据存入缓冲区,最后将缓冲区写入BIN文件。同时,需要处理可能的地址间隙,填充默认值。 另外,用户可能想知道如何处理大地址空间导致内存问题,这时可以建议分块处理或使用临时文件,但基本示例可能先处理较小的文件。 最后,生成相关问题时,需要考虑用户可能的后续疑问,例如如何处理地址间隙、优化转换速度、处理不同格式的HEX文件等。</think>根据HEX文件格式特性,我将为您提供两种Python实现方案。以下实现严格遵循Intel HEX格式规范,可正确处理地址扩展和数据填充。 ### 基础实现方案(手工解析) ```python def hex_to_bin(hex_file, bin_file, fill=0xFF): max_address = 0 data = {} # 解析HEX文件 with open(hex_file, 'r') as f: for line in f: line = line.strip() if not line.startswith(':'): continue byte_count = int(line[1:3], 16) address = int(line[3:7], 16) record_type = int(line[7:9], 16) checksum = int(line[-2:], 16) # 校验和验证 calc_checksum = (sum(bytes.fromhex(line[1:-2])) & 0xFF) ^ 0xFF if (calc_checksum + 1) % 0x100 != checksum: raise ValueError(f"校验错误于记录: {line}") # 处理扩展线性地址(类型0x04) if record_type == 0x04: upper_address = int(line[9:13], 16) upper_address <<= 16 # 处理数据记录(类型0x00) elif record_type == 0x00: current_address = upper_address + address hex_data = line[9:9+byte_count*2] for i in range(0, len(hex_data), 2): data[current_address + i//2] = int(hex_data[i:i+2], 16) max_address = max(max_address, current_address + i//2) elif record_type == 0x01: # 文件结束 break # 生成连续二进制数据 bin_buffer = bytearray([fill] * (max_address + 1)) for addr, value in data.items(): if addr <= max_address: bin_buffer[addr] = value # 写入BIN文件 with open(bin_file, 'wb') as f: f.write(bin_buffer) print(f'成功转换 {hex_file} 到 {bin_file} (长度: {len(bin_buffer)} 字节)') ``` ### 进阶方案(使用intelhex库) 安装库: ```bash pip install intelhex ``` 实现代码: ```python from intelhex import IntelHex def hex_to_bin_pro(hex_file, bin_file): ih = IntelHex() ih.loadhex(hex_file) ih.tobinfile(bin_file) print(f'专业转换完成,输出文件: {bin_file}') print(f'起始地址: 0x{ih.minaddr():08X}') print(f'结束地址: 0x{ih.maxaddr():08X}') ``` ### 使用示例 ```python # 基础版使用 hex_to_bin('firmware.hex', 'output.bin') # 专业版使用 hex_to_bin_pro('complex.hex', 'pro_output.bin') ``` ### 关键处理逻辑说明 1. **地址扩展处理**:正确解析类型04记录实现32位地址支持[^2] 2. **数据间隙填充**:自动填充未定义地址区域(默认0xFF) 3. **校验和验证**:确保数据完整性检查[^3] 4. **内存优化**:使用字典暂存非连续数据,最后生成连续缓冲区 ### 性能优化建议 - 对于大文件(>1MB),建议使用专业库方案 - 设置合理的填充值(如未编程区域保持0xFF) - 处理分段地址时可启用分块写入
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值