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

Класс Struct() модуля struct в Python

Тип данных структура Struct() модуля struct

Модуль struct определяет тип Struct().

Содержание:


Синтаксис:

import struct

s = struct.Struct(format)

Параметры:

Возвращаемое значение:

  • новый объект Struct().

Описание:

Класс Struct() модуля struct возвращает новый объект Struct(), который записывает и читает двоичные данные в соответствии со строкой формата format.

Создание объекта Struct() один раз и вызов его методов более эффективен, чем вызов функций модуля struct с тем же форматом, т.к. строку формата необходимо скомпилировать только один раз.

Примечание. Скомпилированные версии последних строк формата, передаваемых в класс struct.Struct() и функции уровня модуля, кэшируются, поэтому программы, использующие только несколько строк формата, не должны беспокоиться о повторном использовании одного экземпляра Struct.

Методы и атрибуты объекта struct.Struct():

s.pack(v1, v2, ...):

Метод s.pack() использует скомпилированный формат и идентичен функции struct.pack().

Что бы узнать размер, используйте функцию len(), т.е. размер будет равен len(result).

s.pack_into(buffer, offset, v1, v2, ...):

Метод s.pack_into() использует скомпилированный формат и идентичен функции struct.pack_into().

s.unpack(buffer):

Метод s.unpack() использует скомпилированный формат и идентичен функции struct.unpack().

Размер буфера buffer в байтах должен равняться размеру данных, которые распаковываются.

s.unpack_from(buffer, offset=0):

Метод s.unpack_from() использует скомпилированный формат и идентичен функции struct.unpack_from().

Размер буфера buffer в байтах, начиная с позиции смещения offset, должен быть не меньше размера данных, которые распаковываются.

s.iter_unpack(buffer):

Метод s.iter_unpack() использует скомпилированный формат и идентичен функции struct.iter_unpack().

Размер буфера buffer в байтах должен быть кратным размеру данных, которые распаковываются.

s.format:

Атрибут s.format возвращает строку формата, используемую для создания данного объекта Struct().

s.size:

Атрибут s.format возвращает вычисленный размер структуры и следовательно байтового объекта, созданного методом s.pack(), соответствующий формату.

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

Простая упаковка и распаковка структуры данных:

>>> import struct
>>> data = (150, 'Привет'.encode('utf-8'), 3.14)
# создаем структуру и компилируем формат
>>> s = struct.Struct('@ I 12s f')
# упаковка данных
>>> pack_data = s.pack(*data)
>>> pack_data
# b'\x96\x00\x00\x00\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\xc3\xf5H@'

# размер упакованных данных
>>> len(pack_data)
# 20
>>> s.size
# 20

# используемый формат данных
>>> s.size.format
# b'@ I 12s f'

# распаковка данных
>>> a, b, c = s.unpack(pack_data)
>>> a
# 150
>>> b.decode()
# 'Привет'
>>> c
# 3.140000104904175

Упаковка с записью в буфер и чтение буфера с распаковкой данных:

>>> import struct
# импортируется модуль ctypes для создания буфера
>>> import ctypes

>>> data = (150, 'Привет'.encode('utf-8'), 3.14)
# создаем структуру и компилируем формат
>>> s = struct.Struct('@ I 12s f')
# размер упакованных данных
>>> size = s.size
# создается буфер с заданным размером 'size'
>>> buff = ctypes.create_string_buffer(size)

# упаковываем и записываем в буфер 'buff'
>>> s.pack_into(buff, 0, *data)
>>> buff.raw
# b'\x96\x00\x00\x00\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\xc3\xf5H@'

# читаем буфер 'buff' и распаковываем данные в переменные
>>> a, b, c = s.unpack_from(buff, 0)
>>> a, b.decode(), c
# (150, 'Привет', 3.140000104904175)