struct.pack длиннее его частей? - PullRequest
1 голос
/ 23 апреля 2020

Я хочу распаковать 6 значений: 2 * UInt16, 1 * UInt32, 1 * UInt16, 2 * Int64

Добавив размер в байтах, я получу 26.

Но python, похоже, считает, что должно быть 32:

>>> a = struct.pack("H",0)
>>> len(a)
2 <-- correct
>>> a = struct.pack("L",0)
>>> len(a)
4 <-- correct
>>> a = struct.pack("q",0)
>>> len(a)
8 <-- correct
>>> a = struct.pack("HHLHqq",0,0,0,0,0,0)
>>> len(a)
32 < -- should be 2 + 2 + 4 + 2 + 8 + 8 = 26 
>>> a = struct.pack("HHLHq",0,0,0,0,0)
>>> len(a)
24 < -- should be 2 + 2 + 4 + 2 + 8 = 18
>>> a = struct.pack("HHLH",0,0,0,0)
>>> len(a)
10 <-- correct again

struct.unpack имеет ту же проблему и требует 32 байта для распаковки "HHLHqq". Однако в моем приложении данные отправляются из внешнего источника, и это всего лишь 26 байтов.

Я мог бы распаковать их по одному в качестве обходного пути, но наверняка должен быть способ отключить это заполнение?

1 Ответ

1 голос
/ 23 апреля 2020

В соответствии с: https://docs.python.org/2/library/struct.html

При использовании нестандартного размера и выравнивания добавление не добавляется, например, с помощью '<', '>', '=' и '!'.

Таким образом, вам нужно просто указать порядковый номер, и заполнение исчезнет:

>>> import struct
>>> len(struct.pack("HHLHqq",0,0,0,0,0,0))
40
>>> len(struct.pack("<HHLHqq",0,0,0,0,0,0))
26
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...