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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:42:50