Почему я не могу распаковать поплавок с другими типами и получить ожидаемый результат? - PullRequest
4 голосов
/ 28 июня 2011

Я пытаюсь разобрать некоторые данные, упакованные в этот двоичный файл, и структурный модуль Python вызывает у меня всевозможные проблемы.Кажется, он не даст мне правильную переменную с плавающей запятой, когда он пытается выполнить более одного типа одновременно:

import struct

# a fragment of the binary file
a = '\x39\x00\xFF\x00\x00\x0A\x00\x1F\x05\xDC\x42\x31\x30\x00\xFF\x00\x00\x0A\x00\xB5\x01\xE6\x42'

struct.unpack_from('1sxHxbxf', a)
# returns ('9', 255, 10, 2.8355782166755716e-09), but 
struct.unpack_from('f',a[7:])
# gives the expected (110.01000213623047,)

1 Ответ

8 голосов
/ 28 июня 2011

По умолчанию типы C представлены в собственном формате и порядке байтов компьютера и при необходимости выровнены путем пропуска байтов панели (в соответствии с правилами, используемыми компилятором C).

Распаковка ожидает, что float будет выровнен по 8-байтовой границе и пропускает более 1 байта заполнения, чтобы попасть туда. Вы можете подтвердить это, пропустив 1 байт самостоятельно:

>>> struct.unpack_from('1sxHxbxf', a)
('9', 255, 10, 2.8355782166755716e-09)
>>> struct.unpack_from('f',a[8:])
(2.8355782166755716e-09,)

Чтобы отключить выравнивание, добавьте =, <, > или ! в начало строки формата .

>>> struct.unpack_from('=1sxHxbxf', a)
('9', 255, 10, 110.01000213623047)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...