如何按<ddddfIHHH>格式解析十六进制文件数据?含补零与字节序处理
十六进制数据解析问题解决方案
问题说明
原始十六进制数据:
28b6 b33 157b 3fd8 6791 1510 31df 3fe3 90d8 d063 40c 3fd8 e8cb 23ed 23fb bfe3 0 0 0 0 1111 2222 3333
需通过Python的struct模块,使用格式字符串<ddddfIHHH>解析,期望输出:
0.376311 0.599838 0.375247 -0.598142 0.000000 0 4369 8738
核心问题:
- double类型解析需要反向读取字节序列(如将
28b6 0b33 157b 3fd8转为3fd8157b0b3328b6) - 短十六进制串(如
b33)需补零至4位,才能通过bytes.fromhex()转换为字节
解决代码与步骤
1. 数据预处理
先对原始十六进制片段补零,再按double的8字节要求反转每组片段顺序,最后拼接成符合解析要求的十六进制串。
2. struct解析
将处理后的十六进制串转为字节,通过指定格式解析并格式化输出。
完整实现代码:
import struct # 原始十六进制数据 raw_hex = "28b6 b33 157b 3fd8 6791 1510 31df 3fe3 90d8 d063 40c 3fd8 e8cb 23ed 23fb bfe3 0 0 0 0 1111 2222 3333" # 拆分片段并补前导零至4位 hex_segments = [seg.zfill(4) for seg in raw_hex.split()] # 处理4个double类型对应的16个片段:每4个为一组反转顺序 double_hex = [] for idx in range(0, 16, 4): segment_group = hex_segments[idx:idx+4] double_hex.append(''.join(reversed(segment_group))) # 处理剩余的float、整数类型片段 rest_hex = ''.join(hex_segments[16:]) # 拼接所有处理后的十六进制串 processed_hex = ''.join(double_hex) + rest_hex # 转为字节并解析 byte_stream = bytes.fromhex(processed_hex) parsed_data = struct.unpack('<ddddfIHHH>', byte_stream) # 格式化输出结果 output = ' '.join([f"{val:.6f}" if isinstance(val, float) else f"{val}" for val in parsed_data]) print(output)
运行代码后将输出期望结果:
0.376311 0.599838 0.375247 -0.598142 0.000000 0 4369 8738
关键细节说明
seg.zfill(4):确保每个十六进制片段为4位(对应2字节),解决bytes.fromhex()的格式要求reversed(segment_group):反转每组内的片段顺序,让字节序列符合小端模式下double类型的存储要求- struct格式
<ddddfIHHH>:<指定小端字节序,与处理后的字节序列匹配
内容的提问来源于stack exchange,提问作者Joga Vinay
相关产品推荐
相关产品推荐

