将字节转换为浮点数?


72

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

Answers:


100
>>> 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@'

7
这仅适用于4或8字节的浮点数。10字节浮点数呢?
dplass 2011年

我同意@dplass,其他的花车呢?而且,为什么在此字符串的末尾出现逗号?
Startec

6
@startec问题是关于4字节浮点数。哪个字符串以逗号结尾?仅来自的元组struct.unpack具有逗号。
tzot

1
@PetrKrampl的精度为C float(单字节,4字节)和C double(双倍字节,8字节)。蟒蛇float真的Ç double。无论存储3.141592654为C的精度如何,将double其转换为C float(通过struct.pack)然后转换回C double(Python将4字节提取为Cfloat并将结果转换回C double/ Python float)时,它都会丢失。这适用于所有使用IEEE754浮点数的Python实现(CPython确实如此;无论如何,我不知道任何系统上都存在不符合IEEE754的Python实现)。
tzot

3
注意:要查看字节数组的各个字节(由b'指示),请使用list()。例如:list(struct.pack('f', 3.141592654))返回单个字节的列表[219, 15, 73, 64]。这非常方便。
加布里埃尔·斯台普斯

9

只需添加一点,如果您想将浮点数作为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
>>> 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.