struct — пакування та розпакування примітивних типів даних

Цей модуль виконує перетворення між значеннями Python та структурами у стилі C, представленими як об’єкти байтів Python, використовуючи рядки формату для опису розмітки даних.

Підтримуються такі порядки байтів:

Символ

Порядок байтів

Розмір

Вирівнювання

@

рідний

рідний

рідний

<

від меншого до більшого (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

e

n/a (напівточне число з рухомою комою)

число з рухомою комою (2)

2

f

float

число з рухомою комою (2)

4

d

double

число з рухомою комою (2)

8

s

char[]

bytes

P

void *

ціле число

  1. Вимагає підтримки long при використанні зі значеннями більшими за 30 біт.

  2. Вимагає підтримки чисел з рухомою комою.

Відмінність від CPython

Пробіли у рядках формату не підтримуються.

Приклади

Пакування та розпакування значень у форматі little-endian. Префікс < вибирає порядок байтів little-endian зі стандартними розмірами та без вирівнювання:

import struct

# Pack an unsigned short (H, 2 bytes) then an unsigned int (I, 4 bytes).
data = struct.pack("<HI", 7, 1000)
# data == b'\x07\x00\xe8\x03\x00\x00'

# Unpack returns a tuple of the values, in order.
struct.unpack("<HI", data)
# (7, 1000)

# calcsize() reports how many bytes the format needs.
struct.calcsize("<HI")
# 6

Пакування у існуючий буфер та розпакування з нього за байтовим зміщенням:

buf = bytearray(8)

# Write a little-endian signed int (i) at offset 2.
struct.pack_into("<i", buf, 2, -12345)
# buf == bytearray(b'\x00\x00\xc7\xcf\xff\xff\x00\x00')

# Read it back from the same offset.
struct.unpack_from("<i", buf, 2)
# (-12345,)

Функції

struct.calcsize(fmt: str) int

Повертає кількість байтів, необхідних для зберігання переданого fmt.

struct.pack(fmt: str, *values: Any) bytes

Пакує values відповідно до рядка формату fmt. Повертає об’єкт байтів, що кодує значення.

struct.pack_into(fmt: str, buffer: Any, offset: int, *values: Any) None

Пакує values відповідно до рядка формату fmt у buffer, починаючи з offset. offset може бути від’ємним для відліку від кінця buffer.

struct.unpack(fmt: str, data: bytes) Tuple

Розпаковує з data відповідно до рядка формату fmt. Повертає кортеж розпакованих значень.

struct.unpack_from(fmt: str, data: bytes, offset: int = 0, /) Tuple

Розпаковує з data, починаючи з offset, відповідно до рядка формату fmt. offset може бути від’ємним для відліку від кінця data. Повертає кортеж розпакованих значень.