Я только что попытался использовать struct.pack в Python в первый раз, и я не понимаю его поведение, когда я смешиваю типыПочему типы микширования в Python struct.pack используют больше пространства, чем необходимо?
Когда я пытаюсь упаковать один символ и ничего больше, он работает как ожидается, т.е.
struct.pack("b",1)
дает '\x01'
. Но как только я пытаюсь смешивать данные другого типа, символ заполняется так долго, как этот тип, например.
struct.pack("bi",1,1)
дает '\x01\x00\x00\x00\x01\x00\x00\x00'
.
Является ли это стандартным поведением и почему? Есть ли способ обойти это?
Редактировать
Проще говоря:
>>> struct.calcsize("b")
1
>>> struct.calcsize("i")
4
>>> struct.calcsize("bi")
8
И удивительно: 'struct.calcsize ('d')' → 8, 'struct.calcsize ('bd')' → 16. Выравнивание и отступы, похоже, зависят от других типов. Это не интуитивно, даже если вы ожидаете выравнивания. EDIT: Я вижу, что размер '' d''равен 8, и определяет, где он может начинаться (с кратным 8), следовательно, отступы. – Alfe
@Alfe Именно поэтому 'struct.calcsize ('db')' равно 9 (обратите внимание, что в C обычно будет 12, поскольку слова должны быть заполнены полностью). – poke
Да, @poke, приятное понятие обмениваться двумя элементами, чтобы показать, что отступ не относится к байту, а к двойнику. – Alfe