我有一个必须解析的二进制文件,我在使用Python。有没有一种方法可以把4个字节转换成单精度的浮点数?
3
个回答
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@'
dplass
:
这只适用于4或8字节的浮点数。那么,10字节的浮点数呢?
Startec
:
我同意@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
发布于
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]
。