将float 32解释为二进制文件并使用python读取

时间:2016-03-31 04:16:55

标签: python numpy computer-science

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

250

00 00 7a 43

00000000 00000000 01111010 01000011

-250

<00> 00 00 7a c3

00000000 00000000 01111010 11000011

0

<00> 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

1 个答案:

答案 0 :(得分:1)

您显示的值表示您的数据存储为little-endian。例如,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
>>>

以上适用于Python 2.在Python 3中,您需要一个缓冲区,例如:

>>> 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。这似乎正是您正在寻找的。