如何基于文件格式/结构解析二进制文件?——Python解析.FIT文件的实操疑问
手动解析FIT文件头:一步步用Python实现
我之前也手动折腾过FIT文件解析,完全理解对着官方文档却不知道怎么下手的感觉!咱们从最基础的文件头开始拆解,用Python的struct模块一步步来,刚好对应你问的读取第一个字节、后续字节、接下来2个字节的需求:
第一步:明确FIT文件头的关键结构
先把你需要的几个字段对应上(完全贴合FIT协议定义):
- 第1个字节:文件头长度,无符号1字节整数
- 接下来3个字节:协议标识,固定为ASCII字符串
"FIT" - 再接下来2个字节:协议版本,无符号2字节小端整数
FIT协议全程采用小端字节序,所以后面struct格式符都要加<前缀来指定字节序。
第二步:代码实现分步读取
用with语句安全打开文件,避免资源泄漏:
import struct # 替换成你的FIT文件路径 fit_file_path = "your_file.fit" with open(fit_file_path, 'rb') as f: # 1. 读取第一个字节:文件头长度 header_size = struct.unpack('<B', f.read(1))[0] print(f"文件头长度: {header_size} 字节") # 标准FIT文件头通常是14字节 # 2. 读取后续3个字节:协议标识 protocol_id = f.read(3).decode('ascii') print(f"协议标识: {protocol_id}") # 必须输出"FIT",否则不是有效的FIT文件 # 3. 读取接下来2个字节:协议版本 protocol_version = struct.unpack('<H', f.read(2))[0] print(f"协议版本: {protocol_version}") # 比如输出20对应2.0版本
关键细节解释
struct格式符说明:
<:指定小端字节序,严格符合FIT协议要求B:无符号字符(1字节),对应文件头长度的类型H:无符号短整型(2字节),对应协议版本的类型struct.unpack()返回的是元组,所以加[0]直接提取具体数值
有效性验证:
- 如果协议标识不是
"FIT",说明你打开的不是标准FIT文件 - 文件头长度如果不是14,可能是自定义扩展头,但绝大多数官方FIT文件都是14字节标准头
- 如果协议标识不是
后续如果要解析更多字段(比如文件大小、制造商ID等),只需要按照协议文档里的字段顺序和类型,用对应的struct格式符依次读取就行——比如接下来的2个字节是Profile版本,用<H读取;再往后4个字节是文件总大小,用<I(无符号4字节整数)读取。
内容的提问来源于stack exchange,提问作者Aradyan




