如何在Python中解析二进制文件并将十六进制转换为Int24?
问题分析与解决方案
你的代码核心问题是逐个处理单字节,而Int24是由3个连续字节组成的整数,同时int(hexa, 24)是错误用法(第二个参数代表进制,不存在24进制,你应该用16进制,但这不是合并多字节的正确方式)。要提取Int24类型数据,必须按3字节为单位读取并转换,同时要明确字节序(大端/小端)。
修正步骤
- 定位目标数据位置:从截图看,文件按16字节分块,你需要提取每个块中偏移0、4、8、12位置开始的3个连续字节(即0-2、4-6、8-10、12-14字节)。
- 使用Python的
struct模块解析多字节整数,它能直接处理大端/小端格式的整数转换,比手动拼接字节更可靠。 - 按块读取或定位偏移,批量提取目标数据。
示例代码
假设你的文件是大端字节序(高位字节在前,比如00 01 2C对应十进制300),代码如下:
import struct output = [] with open("your_binary_file.bin", "rb") as f: file_contents = f.read() block_size = 16 # 对应截图中每行16字节的块 for i in range(0, len(file_contents), block_size): block = file_contents[i:i+block_size] if len(block) < block_size: break # 跳过最后不完整的块 # 提取每个目标偏移的3字节并转换 for offset in [0, 4, 8, 12]: int24_bytes = block[offset:offset+3] # 补1个0字节到高位,转成无符号32位整数后取低24位 uint24 = struct.unpack('>I', b'\x00' + int24_bytes)[0] # 如果是有符号Int24,需处理符号扩展: # int24 = struct.unpack('>i', (b'\xff' if int24_bytes[0] >= 0x80 else b'\x00') + int24_bytes)[0] output.append(str(uint24))
如果是小端字节序(低位字节在前,比如2C 01 00对应300),只需修改struct格式符:
uint24 = struct.unpack('<I', int24_bytes + b'\x00')[0]
关键说明
你提到的2C期望得到300,对应的是3字节组合(00 01 2C大端或2C 01 00小端)的结果,必须读取连续3个字节才能得到正确值,单字节处理必然只能得到int8结果。若需要转成Int32,只需按上述代码中补全字节的方式直接转换即可。
内容的提问来源于stack exchange,提问作者Norman Kuo
相关产品推荐
相关产品推荐

