Модуль struct
определяет следующее исключение и функции.
struct.error()
struct.pack()
[упаковать объект]struct.pack_into()
[упаковать и записать в буфер]struct.unpack()
[распаковать буфер]struct.unpack_from()
[распаковывает буфер начиная с позиции]struct.iter_unpack()
[распаковывать буфер в итератор]struct.calcsize()
[получить размер структуры]struct.error(msg)
:Исключение struct.error()
которое можно поднятое в различных случаях. Аргумент msg
- это строка, описывающая, что не так.
>>> import struct >>> struct.error # <class 'struct.error'> >>> struct.error('zdfgzdfg') # error('zdfgzdfg',)
struct.pack(format, v1, v2, ...)
:Функция struct.pack()
возвращает объект байтов, содержащий значения v1
, v2
, …, упакованные в соответствии с форматом format
строки формата. Аргументы должны точно соответствовать значениям, требуемым форматом format
.
>>> import struct # данные >>> data = (150, 'Привет'.encode('utf-8'), 3.14) # упаковка данных >>> pack = struct.pack('@ I 12s f', *data) >>> pack # b'\x96\x00\x00\x00\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\xc3\xf5H@'
struct.pack_into(format, buffer, offset, v1, v2, ...)
:Функция struct.pack_into()
упаковывает значения v1
, v2
, … в соответствии с форматом format
строки формата и запишет упакованные байты в буфер buffer
предназначенный для записи, начиная с позиции offset
.
Обратите внимание, что смещение offset
является обязательным аргументом.
>>> import struct, ctypes # данные >>> data = (150, 'Привет'.encode('utf-8'), 3.14) # формат данных >>> fmt = '@ I 12s f' # размер данных >>> size = struct.calcsize(fmt) # создание буфера >>> buff = ctypes.create_string_buffer(size) # пакуем данные и пишем в буфер >>> struct.pack_into(fmt, buff, 0, *data) >>> buff.raw # b'\x96\x00\x00\x00\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\xc3\xf5H@'
struct.unpack(format, buffer)
:Функция struct.unpack()
распаковывает буфер buffer
, предположительно упакованного функцией struct.pack(format, ...)
в соответствии с форматом строки формата.
Результатом работы функции struct.unpack()
является кортеж, даже если он содержит ровно один элемент.
Размер буфера в байтах должен соответствовать размеру, требуемому форматом, как отражено в struct.calcsize()
.
>>> import struct >>> record = b'raymond \x32\x12\x08\x01\x08' # присвоение c распаковкой >>> name, serialnum, school, gradelevel = struct.unpack('< 10s H H b', record) >>> print(name, serialnum, school, gradelevel) # b'raymond ' 4658 264 8
struct.unpack_from(format, buffer, offset=0)
:Функция struct.unpack_from()
распаковывает буфер buffer
, начиная с позиции смещения offset
, в соответствии с форматом format
строки формата.
Результатом работы функции struct.unpack()
является кортеж, даже если он содержит ровно один элемент.
Размер буфера в байтах, начиная со смещения позиции, должен быть не меньше размера, требуемого форматом, как отражено в struct.calcsize()
.
# причитаем и распакуем буфер 'buff', который был # создан ранее функцией struct.pack_into() выше. >>> import struct # формат данных >>> fmt = '@ I 12s f' # читаем буфер 'buff' и распаковываем данные в переменные >>> a, b, c = s.unpack_from(fmt, buff, 0) >>> a, b.decode(), c # (150, 'Привет', 3.140000104904175)
struct.iter_unpack(format, buffer)
:Функция struct.iter_unpack()
лениво распаковывает буфер buffer
в соответствии с форматом строки формата.
Эта функция возвращает итератор, который будет читать куски одинакового размера из буфера, пока все его содержимое не будет использовано. Каждая итерация дает кортеж, как указано в строке формата format
.
Размер буфера в байтах должен быть кратным размеру, требуемому форматом, как отражено в struct.calcsize()
.
struct.calcsize(format)
:Функция struct.calcsize()
возвращает размер структуры и следовательно байтового объекта, созданного функцией struct.pack(format, ...)
, соответствующий формату format
строки формата.
>>> import struct # формат данных >>> fmt = '@ I 12s f' # размер данных >>> struct.calcsize(fmt) # 20 >>> fmt = '120c 12f' >>> struct.calcsize(fmt) # 168