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

Функции и исключения модуля struct в Python

Модуль struct определяет следующее исключение и функции.

Содержание:


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