Модуль struct используется для упаковки и распаковки примитивных типов данных в и из форматированной байтовой строки.

Поддерживаемые порядки байтов:

СимволПорядок байтовРазмерВыравнивание
@nativeнативныйнативное
<little-endianстандартотсутствует
>big-endianстандартотсутствует
!сетевой (= big-endian)стандартотсутствует

Поддерживаемые типы данных:

ФорматC ТипPython типСтандартный размер
bsigned charцелое число1
Bunsigned charцелое число1
hshortцелое число2
Hunsigned shortцелое число2
iintцелое число 14
Iunsigned intцелое число 14
llongцелое число 14
Lunsigned longцелое число 14
qlong longцелое число 18
Qunsigned long longцелое число 18
ffloatчисло с плавающей запятой 24
ddoubleчисло с плавающей запятой 28
schar[]bytes
Pvoid *целое число
  1. Требуется поддержка длинных целых чисел при использовании значений больше 30 бит.
  2. Требуется поддержка чисел с плавающей запятой.

Пробелы в строках форматов не поддерживаются.

Функции

calcsize

Функция calcsize(fmt) возвращает количество байтов, необходимых для хранения данных заданного формата fmt.

  import struct

fmt = 'I2sf'
size = struct.calcsize(fmt)
print("Количество байтов:", size)  # Количество байтов: 12
  

pack

Функция pack(fmt, v1, v2, ...) упаковывает значения v1, v2, … согласно строке формата fmt. Возвращает объект bytes, кодирующий значения.

  import struct

packed_data = struct.pack('I2sf', 1, b'AB', 2.5)
print("Упакованные данные:", packed_data)
# Упакованные данные: b'\x01\x00\x00\x00AB\x00\x00\x00\x00 @'
  

pack_into

Функция pack_into(fmt, buffer, offset, v1, v2, ...) упаковывает значения v1, v2, … согласно строке формата fmt в buffer начиная с offset. offset может быть отрицательным для отсчёта от конца buffer.

  import struct

buffer = bytearray(12)
struct.pack_into('I2sf', buffer, 0, 1, b'AB', 2.5)
print("Буфер после упаковки:", buffer)  
# Буфер после упаковки: bytearray(b'\x01\x00\x00\x00AB\x00\x00\x00\x00 @')
  

unpack

Функция unpack(fmt, data) распаковывает данные из data согласно строке формата fmt. Возвращает кортеж распакованных значений.

  import struct

packed_data = b'\x01\x00\x00\x00AB\x00\x00\x00\x00 @'
unpacked_data = struct.unpack('I2sf', packed_data)
print("Распакованные данные:", unpacked_data)
# Пример вывода: (1, b'AB', 2.5)
  

unpack_from

Функция unpack_from(fmt, data, offset=0, /) распаковывает данные из data, начиная с offset, согласно строке формата fmt. offset может быть отрицательным для отсчёта от конца data. Возвращает кортеж из распакованных значений.

  import struct

buffer = bytearray(b'\x01\x00\x00\x00AB\x00\x00\x00\x00 @')
unpacked_data = struct.unpack_from('I2sf', buffer, 0)
print("Распакованные данные:", unpacked_data)  
# Распакованные данные: (1, b'AB', 2.5)