将字节转换为浮点数?
Posted
技术标签:
【中文标题】将字节转换为浮点数?【英文标题】:Convert Bytes to Floating Point Numbers? 【发布时间】:2008-08-07 22:24:27 【问题描述】:我有一个必须解析的二进制文件,我正在使用 Python。有没有办法把 4 个字节转换成单精度浮点数?
【问题讨论】:
【参考方案1】:>>> 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@'
【讨论】:
这仅适用于 4 或 8 字节浮点数。 10 字节的浮点数呢? 我同意@dplass,其他花车呢。而且,为什么这个字符串的末尾有一个逗号? @startec 问题是关于 4 字节浮点数。哪个字符串以逗号结尾?只有来自struct.unpack
的元组有逗号。
@PetrKrampl 精度为 C 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 实现)。
注意:要查看字节数组的各个字节(用 b' 表示),请使用 list()
。例如:list(struct.pack('f', 3.141592654))
以[219, 15, 73, 64]
返回单个字节的列表。这非常方便。【参考方案2】:
只是一点点补充,如果你想要一个浮点数作为 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
>>>
【讨论】:
或者您可以参考 RHS 上的列表位置x = struct.unpack('f', b'\xdb\x0fI@')[0]
以上是关于将字节转换为浮点数?的主要内容,如果未能解决你的问题,请参考以下文章