【发布时间】:2010-09-05 13:07:04
【问题描述】:
我有一个必须解析的二进制文件,并且我正在使用 Python。有没有办法把 4 个字节转换成单精度浮点数?
【问题讨论】:
标签: python floating-point
我有一个必须解析的二进制文件,并且我正在使用 Python。有没有办法把 4 个字节转换成单精度浮点数?
【问题讨论】:
标签: python floating-point
>>> import struct
>>> struct.pack('f', 3.141592654)
b'\xdb\x0fI@'
>>> struct.unpack('f', b'\xdb\x0fI@')
(3.1415927410125732,)
>>> struct.pack('4f', 1.0, 2.0, 3.0, 4.0)
'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@'
【讨论】:
struct.unpack 的元组有逗号。
float(单,4 字节)和 C double(双,8 字节)。 Python float 真的是 C double。无论将 3.141592654 存储为 C double 的准确性如何,当它转换为 C float(通过 struct.pack)然后返回 C double(Python 将 4 字节提取为 C float 然后将结果转换回 C double/Python float)。这适用于所有使用 IEEE754 浮点数的 Python 实现(CPython 可以;无论如何,我不知道任何系统上有任何不符合 IEEE754 的 Python 实现)。
list()。例如:list(struct.pack('f', 3.141592654)) 以[219, 15, 73, 64] 返回单个字节的列表。这非常方便。
只是一点点补充,如果你想要一个浮点数作为 unpack 方法的输出而不是一个元组,只需编写
>>> [x] = struct.unpack('f', b'\xdb\x0fI@')
>>> x
3.1415927410125732
如果你有更多的浮点数,那么就写
>>> [x,y] = struct.unpack('ff', b'\xdb\x0fI@\x0b\x01I4')
>>> x
3.1415927410125732
>>> y
1.8719963179592014e-07
>>>
【讨论】:
x = struct.unpack('f', b'\xdb\x0fI@')[0]