У меня есть двоичный файл, который я должен проанализировать, и я использую Python. Есть ли способ взять 4 байта и преобразовать его в число с плавающей запятой одинарной точности?
Cristian
7.08.2008 22:24:27
2 ОТВЕТА
РЕШЕНИЕ
>>> 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@'
88
tzot
7.05.2016 20:53:01
Просто небольшое дополнение, если вы хотите, чтобы число с плавающей запятой выводилось из метода распаковки вместо кортежа, просто напишите
>>> [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
>>>
7
NDM
26.07.2019 21:43:08
struct.unpack
имеет запятую.>>> import struct
>>> a=3.141592654
>>> print a
3.141592654
>>> a_packed=struct.pack('f', a)
>>> b=struct.unpack('f', a_packed)[0]
>>> print b
3.14159274101
>>> assert a==b, "A non B"
Traceback (most recent call last):
`Файл" <stdin> ", строка 1, в <module>`AssertionError: A non B
list()
. Пример:list(struct.pack('f', 3.141592654))
возвращает список отдельных байтов как[219, 15, 73, 64]
. Это очень удобно.