struct — empaquetar y desempaquetar tipos de datos primitivos

Este módulo realiza conversiones entre valores de Python y structs al estilo de C representados como objetos bytes de Python, usando cadenas de formato para describir la disposición de los datos.

Se admiten los siguientes órdenes de bytes:

Carácter

Orden de bytes

Tamaño

Alineación

@

nativo

nativo

nativo

<

little-endian

estándar

ninguna

>

big-endian

estándar

ninguna

!

red (= big-endian)

estándar

ninguna

Se admiten los siguientes tipos de datos:

Formato

Tipo C

Tipo Python

Tamaño estándar

b

signed char

entero

1

B

unsigned char

entero

1

h

short

entero

2

H

unsigned short

entero

2

i

int

entero (1)

4

I

unsigned int

entero (1)

4

l

long

entero (1)

4

L

unsigned long

entero (1)

4

q

long long

entero (1)

8

Q

unsigned long long

entero (1)

8

e

n/d (half-float)

float (2)

2

f

float

float (2)

4

d

double

float (2)

8

s

char[]

bytes

P

void *

entero

  1. Requiere compatibilidad con long cuando se usa con valores mayores de 30 bits.

  2. Requiere compatibilidad con punto flotante.

Diferencia con CPython

No se admiten espacios en blanco en las cadenas de formato.

Ejemplos

Empaquetar y desempaquetar valores little-endian. El prefijo < selecciona el orden de bytes little-endian con tamaños estándar y sin alineación:

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

Empaquetar en y desempaquetar desde un búfer existente a partir de un desplazamiento de bytes:

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,)

Funciones

struct.calcsize(fmt: str) int

Devuelve el número de bytes necesarios para almacenar el fmt indicado.

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

Empaqueta los values según la cadena de formato fmt. El valor devuelto es un objeto bytes que codifica los valores.

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

Empaqueta los values según la cadena de formato fmt en un buffer a partir de offset. offset puede ser negativo para contar desde el final de buffer.

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

Desempaqueta a partir de data según la cadena de formato fmt. El valor devuelto es una tupla con los valores desempaquetados.

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

Desempaqueta a partir de data comenzando en offset según la cadena de formato fmt. offset puede ser negativo para contar desde el final de data. El valor devuelto es una tupla con los valores desempaquetados.