Recherche…


Syntaxe

  • pack (fmt, v1, v2, ...)
  • décompresser (fmt, buffer)

Mettre en forme une liste de valeurs dans un objet octet

from struct import pack

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

Décompresser un objet octet selon une chaîne de format

from struct import unpack

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

Emballage d'une structure

Le module " struct " permet de conditionner des objets python en tant que bloc d'octets contigu ou de dissocier un bloc d'octets en structures python.

La fonction pack prend une chaîne de format et un ou plusieurs arguments et renvoie une chaîne binaire. Cela ressemble beaucoup à ce que vous formiez une chaîne, sauf que la sortie n'est pas une chaîne mais un bloc d'octets.

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)

Sortie:

Ordre d'exécution natif: petit bloc d'octet: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05' Bloc d'octets décompressé: (3, 4, 5) Bloc d'octets: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05 \ x00 '

Vous pouvez utiliser l'ordre des octets du réseau avec les données reçues du réseau ou des données de pack pour les envoyer au réseau.

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)

Sortie:

Ordre d'octet natif de bloc d'octets: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00'

Ordre des octets du réseau de blocs d'octets: '\ x00 \ x03 \ x00 \ x04 \ x00 \ x05'

Vous pouvez optimiser en évitant la surcharge liée à l'allocation d'un nouveau tampon en fournissant un tampon créé précédemment.

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)

Sortie:

Bloc d'octets: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00 \ x00 \ x00'

Bloc d'octets: '\ x00 \ x00 \ x03 \ x00 \ x04 \ x00 \ x05 \ x00'



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow