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

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

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

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

Формат C Тип Python тип Стандартный размер
b signed char целое число 1
B unsigned char целое число 1
h short целое число 2
H unsigned short целое число 2
i int целое число 1 4
I unsigned int целое число 1 4
l long целое число 1 4
L unsigned long целое число 1 4
q long long целое число 1 8
Q unsigned long long целое число 1 8
f float число с плавающей запятой 2 4
d double число с плавающей запятой 2 8
s char[] bytes
P void * целое число
  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)