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 |
Requiere compatibilidad con long cuando se usa con valores mayores de 30 bits.
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.