You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:57:04