Символы формата в строке формата format
имеют следующее значение:
'<'
, '>'
, '!'
или '='
.Таблица символов, используемых в строке формата структуры:
Формат | Тип C | Тип Python | Размер | Заметки |
x | pad byte | no value | ||
c | char | bytes of length 1 | 1 | |
b | signed char | integer | 1 | (1), (2) |
B | unsigned char | integer | 1 | (2) |
? | _Bool | bool | 1 | (1) |
h | short | integer | 2 | (2) |
H | unsigned short | integer | 2 | (2) |
i | int | integer | 4 | (2) |
I | unsigned int | integer | 4 | (2) |
l | long | integer | 4 | (2) |
L | unsigned long | integer | 4 | (2) |
q | long long | integer | 8 | (2) |
Q | unsigned long long | integer | 8 | (2) |
n | ssize_t | integer | (3) | |
N | size_t | integer | (3) | |
e | IEEE 754 binary16 | float | 2 | (4) |
f | float | float | 4 | (4) |
d | double | float | 8 | (4) |
s | char[] | bytes | ||
p | char[] | bytes | ||
P | void * | integer | (5) |
Заметки:
'?'
соответствует типу _Bool
, определенному C99. Если этот тип не доступен, он имитируется с помощью символа. В стандартном режиме он всегда представлен одним байтом.__index__()
, то этот метод вызывается для преобразования аргумента в целое число перед упаковкой.'n'
и 'N'
доступны только для родного размера, выбранного по умолчанию или с характером порядка байт '@'. Для стандартного размера вы можете использовать любой из других целочисленных форматов, который подходит вашему приложению.'f'
, 'd'
и 'e'
, упакованное представление использует IEEE 754 binary32
, binary64
или binary16
формат для 'f'
, 'd'
или 'e'
соответственно, независимо от формата с плавающей точкой, используемой платформой.'P'
доступен только для собственного порядка байтов (символ порядка байт - '@'
). Символ порядка байтов '='
выбирает порядок с прямым или младшим порядком байтов на основе хост-системы. Модуль struct
не интерпретирует '='
(порядком байтов на основе хост-системы) как собственный порядок, поэтому, в этом случае символ формата 'P'
недоступен.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'