Maison > Article > développement back-end > Description détaillée du flux d'octets de structure Python, du module d'implémentation de regroupement et de déballage
Tout le monde devrait être familier avec les mots anglais comme struct, car il y a struct dans c/c, où struct est appelé structure. Struct est également utilisé dans Python, ce qui démontre pleinement que cette structure doit avoir une origine profonde avec la structure en c/c. Python utilise le module struct pour effectuer des conversions entre les valeurs Python et les structures C afin de former des objets Python bytes. Il utilise le format chaîne comme description compacte de la structure C sous-jacente, puis convertit la chaîne de format en une valeur Python.
Nous savons que python ne définit que 6 types de données, chaîne, entier, nombre à virgule flottante, liste, tuple, dictionnaire. Mais il existe des variables de type octet en langage C Comment les implémenter en python ? Ceci est très important, surtout si les données doivent être transmises sur le réseau.
Python fournit un module struct pour assurer la conversion. Voici quelques méthodes dans ce module.
pack(fmt, v1, v2, ...) ------ Convertit les valeurs v1, v2, ... en une chaîne selon le format décrit par le fmt donné.
unpack(fmt, bytes) ------ Analysez inversement les octets selon le format décrit par le fmt donné et renvoyez un tuple.
calcsize(fmt) ------ Renvoie la taille de la structure selon le format décrit par le fmt donné.
struct.pack() :
struct.pack est utilisé pour convertir la valeur Python en chaîne en fonction du caractère de format (car il n'y a pas de type octet (Byte) en Python, vous peut le mettre ici. La chaîne est comprise comme un flux d'octets ou un tableau d'octets). Le prototype de fonction est : struct.pack(fmt, v1, v2, ...), le paramètre fmt est la chaîne de format et les informations pertinentes sur la chaîne de format sont présentées ci-dessous. v1, v2, ... représentent les valeurs Python à convertir. L'exemple suivant convertit deux entiers en chaînes (flux d'octets) :
>>> import struct
>>> >> b=400
>>> str=struct.pack('ii',a,b) #Convertir en flux d'octets, bien qu'il s'agisse toujours d'une chaîne, mais peut être transmis sur le réseau
>>>
printlen(str) #ii représente deux ints 8 section, exactement la longueur de deux données de type int
>>> print str
#Le code binaire est tronqué
>>> 0x00x90x01x00x00'# Les hexadécimaux 0x00000014, 0x00001009 représentent respectivement 20 et 400
>>>
À partir de là, nous pouvons faire ce que nous voulons. Par exemple, dans l'exemple d'emballage suivant, emballer uniquement
format = "!HH%ds" % len(data)
le tampon est introduit = struct.pack(format,opcode,blocknumber,data)
Nous devons regrouper des données et ajouter des en-têtes. Sur la base des informations sur les caractères de format suivants, nous savons que H n'est pas signé et que la section courte est de 2 caractères, et s est de type char. Ce tampon est donc un opcode de 2 octets, un numéro de bloc de 2 octets et un caractère long.
Module Python - struct (implémentation du flux d'octets, du regroupement et du déballage)
struct.unpack() :
Continuons avec l'exemple d'exécution ci-dessus :
>>> a1,a2=struct.unpack('ii',str)
>>> >a1 20
>>> print 'a2=',a2
a2= 400
Vous pouvez voir que "ii" est représenté par quatre octets pour démarcation, la chaîne de 8 octets est divisée en deux entiers de type int.
struct.calcsize() : utilisé pour calculer la taille de la sortie dans un format spécifique, qui est de quelques octets, tel que :
>>> 'HH4s')
8
>>> struct.calcsize('ii')
8
>>>
>>> format='!HH%ds' % len('bonjour python')
>>> 🎜>16
>>>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!