将字节转换为浮点数?

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]

以上是关于将字节转换为浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中将4字节数组转换为浮点数

将(n个第一个字节)无符号字符指针转换为浮点数和双精度C++

怎么将4字节16进制转化成浮点数

组合四个字节并转换为浮点数

NEON 汇编代码,如何将 BYTE 转换为浮点数?

将 24 位值转换为浮点数并返回