Модуль struct
определяет тип Struct()
.
Содержание:
import struct s = struct.Struct(format)
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)