解释二进制文件中的 float 32 并用 python 读取

interpret float 32 in binary file and read with python

首先承认我不是计算机科学家,所以如果这是一个愚蠢的问题,我提前道歉。 我正在尝试使用十六进制编辑器找出二进制文件格式。我能够很好地读取整数和字符(在 python 中使用 numpy)但是当我到达浮点数时我遇到了问题,它们似乎不是 IEEE 754 二进制 32 并且当我尝试将 numpy 与dtype 'f4' 读取这块内存它 returns 一个不正确的值。我试过切换字节顺序无济于事。任何了解这些数字的格式都会很有用,但更重要的是,我将如何在 python 中读取它们(假设它们在字节字符串中)?以下是一个示例,其中已知值在顶部以小数形式给出,在编辑器中找到的十六进制值,然后是文件中的二进制值。


250

00 00 7a 43

00000000 00000000 01111010 01000011


-250

00 00 7a c3

00000000 00000000 01111010 11000011


0

00 00 00 00

00000000 00000000 00000000 00000000


200

00 00 48 43

00000000 00000000 01001000 0011 1111


250.1

9a 19 7a 43

10011010 00011001 01111010 01000011


您显示的值表明您的数据是以小端法存储的。例如,250.0 的 32 位 IEEE 浮点字符串是十六进制的 437a0000。对应的little-endian字节序列为:

00 00 7a 43

这正是您所看到的。

我认为问题在于 Python 通常对其 float 类型使用双精度,即 64 位浮点值。

正确解压缩这些值的一种方法是 struct:

>>> import struct
>>> struct.unpack('>f', '\x43\x7a\x00\x00')[0]
250.0
>>>

以上对Python2有效,在Python3中,需要一个buffer,如:

>>> struct.unpack('>f', b'\x43\x7a\x00\x00')[0]
250.0
>>>

或:

>>> struct.unpack('>f', bytes([0x43, 0x7a, 0x00, 0x00]))[0]
250.0
>>>

有关详细信息,请参阅 Python 2 的结构文档或 Python 3。这似乎正是您要找的。