解释二进制文件中的 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 中使用 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
>>>