2014-09-16 1 views
3

Может кто-нибудь объяснить, почему я получаю дополнительные байты, когда я использую собственный порядок байтов с struct.pack?Объясните дополнительное дополнение в struct.pack с собственным байтовым порядком

>>> import struct 
>>> struct.pack('cI', 'a', 1) 
'a\x00\x00\x00\x01\x00\x00\x00' 

>>> struct.pack('<cI', 'a', 1) 
'a\x01\x00\x00\x00' 

так что у собственного байтового порядка есть 'a', а затем 3- (00 bytes) перед ним. Почему в байтах с собственным байтом есть эти байты, в то время как порядок байтов без байтов или больших байтов нет?

ответ

7

Это объясняет в struct module documentation:

Примечания: По умолчанию результата упаковки данного C-структуры включает в себя площадку байты для того, чтобы поддерживать правильное выравнивание для типов C, участвующих; Аналогично, выравнивание учитывается при распаковке. Это поведение выбирается так, чтобы байты упакованной структуры точно соответствовали макету в памяти соответствующей структуры C. Чтобы обрабатывать форматы данных, не зависящие от платформы, или опускать неявные байты элемента, используйте стандартный размер и выравнивание вместо собственного размера и выравнивания: см. «Порядок, размер и выравнивание байтов» для получения подробной информации.

В Byte Order, Size, Alignment:

....

Родной размер и выравнивание определяются с использованием выражения С компилятора SIZEOF. Это всегда сочетается с собственным байтовым порядком.

...

Примечание:

  1. Перетяжка только автоматически добавляются между последовательными структурами членов.
  2. В начале или в конце кодированной структуры заполнение не заполняется. Никакая добавка не добавляется при использовании неродного размера и выравнивания , например. с '<', '>', '=' и '!'.
  3. Чтобы выровнять конец структуры с требованием к выравниванию определенного типа, завершите формат с кодом для этого типа с количеством повторений, равным нулю. См. Примеры.
+0

Это определенно очищает вещи. Я больше читаю о том, как C sizeof работает с типами python. Но спасибо, это заставляет меня на правильном пути. –

Смежные вопросы