Contenu

  • 1. Utilisation du module struct. Les données binaires empaquetées
  • 2. Les méthodes de base du module struct
    • 2.1. Les méthodes pack() et unpack(). L’empaquetage et le dépaquetage des données
    • 2.2. La méthode calcsize(). La taille de l’objet emballé
  • 3. Chaînes de caractères formatées
    • 3.1. Définir l’ordre des octets, la taille et l’alignement en fonction du caractère de format
    • 3.2. Exemples de chaînes formatées pour différents types de données
  • Sujets connexes

Recherche sur d’autres sites web:

1. Utilisation du module struct. Données binaires emballées

Le module struct de Python est utilisé pour créer et tirer des données binaires emballées à partir de chaînes de caractères. Dans le module struct, les octets de données sont interprétés comme des données binaires empaquetées qui peuvent être représentées par des objets de type bytes ou bytearray.

Le module contient des outils de conversion entre les valeurs Python et les structures C, qui sont représentées comme des objets byte Python. Ces conversions sont utilisées pour traiter les données binaires qui sont stockées dans des fichiers ou obtenues à partir de connexions réseau, etc.

Pour fournir une description compacte des structures C et de la conversion en valeurs (à partir de valeurs) de Python, des chaînes de format sont utilisées.

2. Les méthodes de base du module struct

Le module struct contient plusieurs méthodes de base que vous pouvez utiliser pour emballer et déballer des données.

2.1. Les méthodes pack() et unpack(). Emballer et déballer des données

Pour emballer et déballer des données, on utilise les méthodes pack(), unpack(). Le processus d’emballage/déballage est mis en œuvre selon la chaîne de format.

Selon la documentation, la forme générale d’utilisation de la méthode pack() est la suivante

obj = struct.pack(format, v1, v2, ...)

  • format – chaîne de format. Cette ligne est formée selon les règles définies dans les tableaux (voir paragraphe 3);
  • v1, v2, … – valeurs (objets) à emballer;
  • objet – objet binaire emballé.

La fonction unpack() effectue l’inverse de l’opération pack(). Elle permet d’obtenir l’objet source à partir de l’objet packé. La forme générale d’utilisation de la fonction est la suivante :

obj = struct.unpack(format, buffer)

ici

  • tampon – un tampon dans lequel est écrit un objet qui a été préalablement empaqueté par la fonction pack(). La taille de cet objet doit correspondre à la taille spécifiée dans format;
  • format – une chaîne de format sur la base de laquelle un objet binaire déballé obj est obtenu;
  • objet – l’objet résultant, qui peut être une liste, un tuple, un ensemble, un dictionnaire, etc.

Lorsqu’on appelle la fonction unpack(), la chaîne de format doit correspondre à la même chaîne que celle qui a été spécifiée par la fonction pack().

Exemple. Pour les besoins de la démonstration, on effectue l’empaquetage/dépaquetage de la liste de nombres.

# Module struct. Methods pack(), unpack()# Pack/unpack list of numbers# 1. Specified list of numbersLS = # 2. Include module structimport struct# 3. Pack list of numbers. Method pack()pack_obj = struct.pack('>4і', LS, LS, LS, LS)# 4. Display the object pack_objprint('pack_obj = ', pack_obj)# 5. Unpack list of numbers. Method unpack().# The result is a tuple T2T2 = struct.unpack('>4і', pack_obj) # T2 = (1, 3, 9, 12)# 6. Print the unpacked object T2print('T2 = ', T2)# 7. Convert tuple T2 to list LS2LS2 = list(T2) # LS2 = # 8. Display the list LS2print('LS2 = ', LS2)

Le résultat du programme

pack_obj = b'\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\t\x00\x00\x00\x0c'T2 = (1, 3, 9, 12)LS2 = 

2.2. Méthode calcsize(). La taille de l’objet emballé

La méthode calcsize() renvoie la taille de l’objet créé par la méthode pack().

Exemple.

# Module struct.# Method calcsize(). Determine the size of the packed object# 1. Include module structimport struct# 2. Determine the size of a packed list of numbers# 2.1. Specified list of floating point numbersLS = # 2.2. Pack list LS. Method pack()pack_obj = struct.pack('>3f', LS, LS, LS)# 2.3. Display the packed object pack_objprint('pack_obj = ', pack_obj)# 2.4. Display the size of pack_objsize = struct.calcsize('>3f') # size = 12print('size = ', size)# 3. Determine the size of a packed tuple of strings# 3.1. The specified tuple of two stringsTS = ( 'Hello', 'abcd')# 3.2. Pack the tuple TSpack_obj = struct.pack('<5s4s', TS.encode(), TS.encode())# 3.3. Display the packed objectprint('pack_obj = ', pack_obj)# 3.4. Display the size of packed tuplesize = struct.calcsize('<5s4s') # size = 9print('size = ', size)

Le résultat du programme

pack_obj = b'@8Q\xec@y\x99\x9a\xc1(\x00\x00'size = 12pack_obj = b'Helloabcd'size = 9

3. Chaînes de caractères formatées
3.1. Définir l’ordre, la taille et l’alignement des octets en fonction du caractère de format

En Python, la façon dont une chaîne est emballée est déterminée en fonction du premier caractère de la chaîne de format. Ce symbole définit :

  • l’ordre des octets, qui est formé à l’aide des caractères @, =, <>, ! Si ce paramètre n’est pas spécifié, le symbole @ est accepté;
  • la taille en octets des données emballées. Dans ce cas, les chiffres qui indiquent le nombre sont utilisés en premier ;
  • l’alignement, qui est défini par le système.

Selon la documentation Python dans la chaîne de format, l’ordre des octets, la taille et l’alignement sont formés en fonction du premier caractère du format. Les premiers caractères possibles du format sont présentés dans le tableau suivant.

Character Byte order Taille Alignement
@ natif (dépend de l’hôte) Native Native
= native standard none
< little-endian standard none
> big-endian standard none
! réseau (= big-endian) standard none

Une valeur d’ordre d’octet peut être l’une de 4 :

  • ordre natif. Cet ordre peut être soit little-endian, soit big-endian. Cet ordre est déterminé par le système hôte;
  • ordre de type little-endian. Dans cet ordre, l’octet de poids faible est traité en premier, puis l’octet de poids fort;
  • ordre de type big-endian. Dans ce cas, l’octet de poids fort est traité en premier, puis l’octet de poids faible;
  • ordre du réseau, qui est par défaut l’ordre big-endian.

La taille des données emballées peut être l’une des deux choses suivantes :

  • native – définie à l’aide des instructions sizeof du compilateur C ;
  • standard – est déterminée sur la base du caractère de format conformément au tableau ci-dessous.

Tableau. Définition de la taille standard des données emballées en fonction du caractère de format

Division

.

.

Format C Type Python Type Taille standard
x pad byte no value
c char octets de longueur 1 1
b signed char entier 1
B non signé char entier 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer 4
l long integer 4
L unsigned long integer 4
q long long integer 8
Q unsigned long long inférieur 8
n ssize_t integer
N size_t integer
e float (format exponentiel) float 2
f float float 4
d double float 8
s char bytes
p char bytes
P void* integer

3.2. Exemples de chaînes de caractères formatées pour différents types de données

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *