Python 3.7.0 - структура calcsize, ошибка или функция? - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь распаковать список значений из байтов.Я хочу прочитать и распаковать их вместе, но я встречаю эту вещь ...

Когда мы вычисляем размер объединенной строки fmt, мы получаем один результат, если мы вычисляем размер всех частей строки fmt и суммируем их, мы получаем другой результат (ожидаемый результат).

from struct import calcsize

f0 = '3B'
f1 = '2H'
f2 = '1B'
f3 = '4H'
f4 = '2B'

print(calcsize(f0) + calcsize(f1) + calcsize(f2) + calcsize(f3) + calcsize(f4))
# 18       (expected) 

print(calcsize(f0 + f1 + f2 + f3 + f4))
# 20       (what?!! o_O)

Может быть, я чего-то не понимаю?

1 Ответ

0 голосов
/ 25 февраля 2019

В «родном» порядке байтов (по умолчанию) модуль struct применяет те же правила заполнения, что и C, к своим структурам.Таким образом, байт заполнения находится между 3B и 2H (потому что H выровнен на два байта), а другой между 1B и 4H.

на документы :

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

Так что просто используйте нестандартный размер / выравнивание, чтобы «исправить» это при необходимости.

...