如何将小端(little endian)格式十六进制字符串转换为浮点数?
小端十六进制字符串转浮点数的正确实现
你的问题出在代码里使用了大端(>)格式符,而输入的十六进制字符串是小端存储的,只需将struct模块的格式符替换为小端标识<即可完成正确转换。
修改后的代码
import struct hex_string = '00e0b8bf' to_int = int(hex_string, 16) # 用小端格式打包32位整数 struct_packed = struct.pack("<i", to_int) # 用小端格式解包为单精度浮点数 to_float = struct.unpack("<f", struct_packed)[0] print(to_float) # 输出:-0.12345600128173828
原理说明
- 十六进制转整数的步骤无需改动,因为整数本身不存在端序概念。
- struct模块的格式符中,
<代表小端字节序,i表示32位有符号整数,f表示32位单精度浮点数。 - 用
<i打包整数时,会按照小端字节序生成字节流;再用<f解包时,同样以小端规则解析字节流为浮点数,完全匹配输入的小端十六进制格式。
另一种等价实现(反转字节顺序)
如果你不想修改格式符,也可以先反转十六进制字符串的字节顺序,再用大端格式处理:
import struct hex_string = '00e0b8bf' # 将十六进制按2字符一组拆分后反转,再拼接成新的十六进制字符串 reversed_hex = ''.join(reversed([hex_string[i:i+2] for i in range(0, len(hex_string), 2)])) to_int = int(reversed_hex, 16) struct_packed = struct.pack(">i", to_int) to_float = struct.unpack(">f", struct_packed)[0] print(to_float) # 输出相同结果
两种方法效果一致,推荐第一种,直接通过格式符指定端序的方式更直观、易维护。
内容的提问来源于stack exchange,提问作者Harry Boy
相关产品推荐
相关产品推荐

