将字节转换为浮点数?

Convert Bytes to Floating Point Numbers?

提问人:Cristian 提问时间:8/8/2008 最后编辑:martineauCristian 更新时间:4/14/2023 访问量:153543

问:

我有一个二进制文件,我必须解析它,我正在使用 Python。有没有办法将 4 个字节转换为单精度浮点数?

Python 浮点

评论


答:

126赞 tzot 9/16/2008 #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@'

评论

8赞 dplass 3/3/2011
这仅适用于 4 或 8 字节浮点数。10字节浮点数呢?
0赞 Startec 8/26/2014
我同意@dplass,其他花车呢。而且,为什么这个字符串的末尾有一个逗号?
6赞 tzot 9/11/2014
@startec 问题是关于 4 字节浮点数的。哪个字符串以逗号结尾?只有 from 的元组有逗号。struct.unpack
1赞 tzot 10/29/2015
@PetrKrampl C(单字节,4 字节)和 C(双字节,8 字节)的精度。Python真的是C。无论存储为 C 的准确性如何,当它转换为 C(通过 struct.pack)然后返回 C(Python 将 4 个字节提取为 C,然后将结果转换回 C /Python )时,它都会丢失。这适用于所有使用浮点数IEEE754的 Python 实现(CPython 确实如此;无论如何,我不知道任何系统上有任何不符合IEEE754的 Python 实现)。floatdoublefloatdouble3.141592654doublefloatdoublefloatdoublefloat
3赞 Gabriel Staples 8/19/2016
注意:要查看字节数组的各个字节(用 b' 表示),请使用 .例如:以 .这非常方便。list()list(struct.pack('f', 3.141592654))[219, 15, 73, 64]
21赞 NDM 1/13/2019 #2

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

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

如果你有更多的浮点数,那么就写

>>> import struct
>>> [x,y] = struct.unpack('ff', b'\xdb\x0fI@\x0b\x01I4')
>>> x
3.1415927410125732
>>> y
1.8719963179592014e-07
>>> 

评论

2赞 lifedroid 1/4/2022
或者,您可以引用 RHS 上的列表位置x = struct.unpack('f', b'\xdb\x0fI@')[0]
4赞 Chance Cuddeback 8/20/2022 #3

我会添加评论,但我没有足够的声誉。

只是为了添加一些信息。如果你有一个包含 X 个浮点数的字节缓冲区,则解包的语法为:

struct.unpack('Xf', ...)

如果值为双倍,则解包为:

struct.unpack('Xd', ...)
0赞 Rousseau 4/14/2023 #4

注释:假设您通过 MODBUS 通信协议接收一个浮点变量(2 个寄存器,每个寄存器 1 个 int),您可以使用以下方式转换消息:

floatvar = struct.unpack('f',int1.to_bytes(2,'big')+int2.to_bytes(2,'big')).

*注意MODBUS是大端序