Buscar..


Sintaxis

  • paquete (fmt, v1, v2, ...)
  • desempaquetar (fmt, buffer)

Formatear una lista de valores en un objeto byte

from struct import pack

print(pack('I3c', 123, b'a', b'b', b'c'))  # b'{\x00\x00\x00abc'

Desempaquetar un objeto byte de acuerdo con una cadena de formato

from struct import unpack

print(unpack('I3c', b'{\x00\x00\x00abc'))  # (123, b'a', b'b', b'c')

Embalaje de una estructura

El módulo " struct " proporciona facilidad para empaquetar objetos de python como trozos contiguos de bytes o para diseminar un trozo de bytes en estructuras de python.

La función de paquete toma una cadena de formato y uno o más argumentos, y devuelve una cadena binaria. Esto se parece mucho a que está formateando una cadena, excepto que la salida no es una cadena sino una porción de bytes.

import struct
import sys
print "Native byteorder: ", sys.byteorder
# If no byteorder is specified, native byteorder is used
buffer = struct.pack("ihb", 3, 4, 5)
print "Byte chunk: ", repr(buffer)
print "Byte chunk unpacked: ", struct.unpack("ihb", buffer)
# Last element as unsigned short instead of unsigned char ( 2 Bytes)
buffer = struct.pack("ihh", 3, 4, 5)
print "Byte chunk: ", repr(buffer)

Salida:

Byteorder nativo: fragmento de bytes pequeño: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x00' Fragmento de bytes sin empaquetar: (3, 4, 5) Fragmento de bytes: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05 \ x00 '

Puede usar el orden de bytes de la red con los datos recibidos de la red o datos del paquete para enviarlos a la red.

import struct
# If no byteorder is specified, native byteorder is used
buffer = struct.pack("hhh", 3, 4, 5)
print "Byte chunk native byte order: ", repr(buffer)
buffer = struct.pack("!hhh", 3, 4, 5)
print "Byte chunk network byte order: ", repr(buffer)

Salida:

Orden de bytes nativo del byte: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00'

Orden de bytes de la red de bytes: '\ x00 \ x03 \ x00 \ x04 \ x00 \ x05'

Puede optimizar evitando la sobrecarga de asignar un nuevo búfer al proporcionar un búfer que se creó anteriormente.

import struct
from ctypes import create_string_buffer
bufferVar = create_string_buffer(8)
bufferVar2 = create_string_buffer(8)
# We use a buffer that has already been created
# provide format, buffer, offset and data
struct.pack_into("hhh", bufferVar, 0, 3, 4, 5)
print "Byte chunk: ", repr(bufferVar.raw)
struct.pack_into("hhh", bufferVar2, 2, 3, 4, 5)
print "Byte chunk: ", repr(bufferVar2.raw)

Salida:

Fragmento de bytes: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00 \ x00 \ x00'

Fragmento de bytes: '\ x00 \ x00 \ x03 \ x00 \ x04 \ x00 \ x05 \ x00'



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow