添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

将字节转换成浮点数?

85 人关注

我有一个必须解析的二进制文件,我在使用Python。有没有一种方法可以把4个字节转换成单精度的浮点数?

python
floating-point
Cristian
Cristian
发布于 2008-08-08
3 个回答
tzot
tzot
发布于 2022-08-20
已采纳
0 人赞同
>>> 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的观点,那其他的浮点数呢。还有,为什么在这个字符串的末尾有一个逗号?
tzot
@startec 问题是关于4字节的浮点数。哪个字符串以逗号结束?只有 struct.unpack 中的元组有逗号。
tzot
@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] 。这是非常方便的。
NDM
NDM
发布于 2022-08-20
0 人赞同

只是一个小小的补充,如果你想要一个浮点数作为解包方法的输出,而不是一个元组,只需写上

>>> import struct
>>> [x] = struct.unpack('f', b'\xdb\x0fI@')
3.1415927410125732

如果你有更多的浮点,那么只要写

>>> import struct
>>> [x,y] = struct.unpack('ff', b'\xdb\x0fI@\x0b\x01I4')
3.1415927410125732
1.8719963179592014e-07
    
另外,你可以参考RHS上的列表位置 x = struct.unpack('f', b'\xdb\x0fI@')[0]
Chance Cuddeback
Chance Cuddeback
发布于 2022-08-20
0 人赞同

我想加个评论,但我没有足够的声誉。

只是要补充一些信息。如果你有一个包含X量浮点的字节缓冲区,解包的语法是。