Модуль struct
Упаковка и распаковка примитивных типов данных
Модуль 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 * | целое число |
- Требуется поддержка длинных целых чисел при использовании значений больше 30 бит.
- Требуется поддержка чисел с плавающей запятой.
Пробелы в строках форматов не поддерживаются.
Функции
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)