Python Language
Dati binari
Ricerca…
Sintassi
- pack (fmt, v1, v2, ...)
- scompattare (fmt, buffer)
Formattare un elenco di valori in un oggetto byte
from struct import pack
print(pack('I3c', 123, b'a', b'b', b'c')) # b'{\x00\x00\x00abc'
Disimballare un oggetto byte in base a una stringa di formato
from struct import unpack
print(unpack('I3c', b'{\x00\x00\x00abc')) # (123, b'a', b'b', b'c')
Imballaggio di una struttura
Il modulo " struct " fornisce la possibilità di impacchettare oggetti python come blocchi contigui di byte o di dissimulare un blocco di byte in strutture python.
La funzione pack accetta una stringa di formato e uno o più argomenti e restituisce una stringa binaria. Questo sembra molto simile alla formattazione di una stringa, tranne per il fatto che l'output non è una stringa ma una porzione di byte.
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)
Produzione:
Byte byte nativo: piccolo byte Byte: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05' Blocco byte scompattato: (3, 4, 5) Bit byte: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x04 \ x00 \ x05 \ x00'
È possibile utilizzare l'ordine dei byte di rete con i dati ricevuti dalla rete o dai dati del pacchetto per inviarlo alla rete.
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)
Produzione:
Ordine byte byte del byte byte: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00'
Ordine dei byte della rete a byte byte: '\ x00 \ x03 \ x00 \ x04 \ x00 \ x05'
È possibile ottimizzare evitando il sovraccarico di allocare un nuovo buffer fornendo un buffer creato in precedenza.
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)
Produzione:
Blocco byte: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00 \ x00 \ x00'
Blocco byte: '\ x00 \ x00 \ x03 \ x00 \ x04 \ x00 \ x05 \ x00'