Сообщить об ошибке.

Символы формата, используемые в строке формата структуры

Типы, поддерживаемые структурами модуля struct

Символы формата в строке формата format имеют следующее значение:

  • Преобразование между значениями C и Python должно быть очевидным, учитывая их типы.
  • Столбец "Стандартный размер" относится к размеру упакованного значения в байтах при использовании стандартного размера. То есть когда строка формата начинается с одного из символов управления '<', '>', '!' или '='.
  • При использовании собственного размера, размер упакованного значения зависит от платформы.

Таблица символов, используемых в строке формата структуры:

ФорматТип CТип PythonРазмерЗаметки
xpad byteno value
ccharbytes of length 11
bsigned charinteger1(1), (2)
Bunsigned charinteger1(2)
?_Boolbool1(1)
hshortinteger2(2)
Hunsigned shortinteger2(2)
iintinteger4(2)
Iunsigned intinteger4(2)
llonginteger4(2)
Lunsigned longinteger4(2)
qlong longinteger8(2)
Qunsigned long longinteger8(2)
nssize_tinteger(3)
Nsize_tinteger(3)
eIEEE 754 binary16float2(4)
ffloatfloat4(4)
ddoublefloat8(4)
schar[]bytes
pchar[]bytes
Pvoid *integer(5)

Заметки:

  1. Символ формата '?' соответствует типу _Bool, определенному C99. Если этот тип не доступен, он имитируется с помощью символа. В стандартном режиме он всегда представлен одним байтом.
  2. При попытке упаковать нецелое число с использованием любого из целочисленных кодов преобразования, если у нецелого числа есть метод __index__(), то этот метод вызывается для преобразования аргумента в целое число перед упаковкой.
  3. Символы формата 'n' и 'N' доступны только для родного размера, выбранного по умолчанию или с характером порядка байт '@'. Для стандартного размера вы можете использовать любой из других целочисленных форматов, который подходит вашему приложению.
  4. Для символов формата 'f', 'd' и 'e', упакованное представление использует IEEE 754 binary32, binary64 или binary16 формат для 'f', 'd' или 'e' соответственно, независимо от формата с плавающей точкой, используемой платформой.
  5. Символ формата 'P' доступен только для собственного порядка байтов (символ порядка байт - '@'). Символ порядка байтов '=' выбирает порядок с прямым или младшим порядком байтов на основе хост-системы. Модуль struct не интерпретирует '=' (порядком байтов на основе хост-системы) как собственный порядок, поэтому, в этом случае символ формата 'P' недоступен.
  6. Тип IEEE 754 binary16 "половинная точность" был представлен в 2008 году в пересмотре стандарта IEEE 754. Он имеет знаковый бит, 5-битную экспоненту и 11-битную точность с явным сохранением 10 битов и может представлять числа между приблизительно 6.1e-05 и 6.5e+04 с полной точностью. Этот тип не широко поддерживается компиляторами языка C: на обычной машине можно использовать для хранения беззнакового короткого целого, но не для математических операций.

Символу формата может предшествовать целое число повторений. Например, строковой формат 4h означает то же самое, что и hhhh.

Пробельные символы между форматами игнорируются, хотя число и его формат не должны содержать пробелов.

Для символа формата 's' число интерпретируется как длина байтов, а не число повторов, как для других символов формата. Например, 10s означает одну 10-байтовую строку, а формат 10c будет означать - 10 символов. Если впереди символа формата не задано число повторений, то по умолчанию используется значение 1. Для упаковки строка обрезается или дополняется нулевыми байтами, чтобы соответствовать размеру. Для распаковки полученный объект байтов всегда имеет точно указанное количество байтов. В особом случае 0s означает одну пустую строку в то время как 0c означает 0 символов).

При упаковке значения x используется один из целочисленных форматов 'b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'. Если значение x вне допустимого диапазона для этого формата , то поднимается исключение struct.error.

Символ формата p кодирует "строку Паскаля", что означает короткую строку переменной длины, хранящуюся в фиксированном количестве байтов, заданных счетчиком. Первый сохраненный байт - это длина строки или 255, в зависимости от того, что меньше. Байты строки следуют. Если строка, переданная в функцию struct.pack() слишком длинная (больше, чем count-1), сохраняются только первые байты строки. Если строка короче, чем count-1, она дополняется нулевыми байтами, так что всегда используется ровное количество байтов. Обратите внимание, что для [функции struct.unpack()][struct.func] символ формата'p'` потребляет количество байтов, но возвращаемая строка не может содержать более 255 байтов.

Для символа формата '?', возвращаемое значение - True или False. При упаковке используется значение истинности объекта аргумента. Будут упакованы 0 или 1 в нативном или стандартном представлении bool, при распаковке любое ненулевое значение будет True.

Примеры использования:

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

>>> pack('ci', b'*', 0x12131415)
# b'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, b'*')
# b'\x12\x13\x14\x15*'
>>> calcsize('ci')
# 8
>>> calcsize('ic')
# 5

Следующий формат 'llh0l' определяет два байта для заполнения нулями в конце, предполагая, что long выровнены по 4-байтовым границам:

>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'