Модуль 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)