程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Tutoriel Python 3: utilisation détaillée des modules struct

編輯:Python

Ce module est conçu pour compléterPythonValeurs etCStructure linguistiquePythonConversion entre les formes de chaîne.Ceci peut être utilisé pour traiter des données binaires stockées dans des fichiers ou à partir d'une connexion réseau,Et d'autres sources de données.

Objet: InPythonConversion entre le type de données de base et les données binaires

structLe module est disponible pour les chaînes d'octets etPythonFonction de conversion entre les types de données natives,Comme les nombres et les chaînes.

Fonctions du module etStructCatégorie

En plus de fournir unStructEn dehors de la classe,Il existe également de nombreuses fonctions au niveau des modules pour traiter les valeurs structurées.Voici un formateur(Format specifiers)Le concept de,.Est la conversion d'un format de chaîne à une représentation compilée,Un traitement similaire à celui des expressions régulières.Généralement instantanéStructCatégorie,Appelez la méthode de classe pour compléter la transformation,Plus efficace que d'appeler directement les fonctions du module.Les exemples suivants sont utilisésStructCatégorie.

Packing(Emballez)EtUnpacking(Déballage)

StructPrise en charge des donnéespacking(Emballez)String,Et peut être inversé à partir d'une chaîneunpacking(Décompresser)Données de sortie.

Dans ce cas,,Spécificateur de format(specifier)Nécessite un entier ou un long entier,Un double octetstring,Et un flotteur.Les espaces dans les formats sont utilisés pour séparer les indicateurs individuels(indicators),Est ignoré lors de la compilation du format.

import struct
import binascii
values = (1, 'ab'.encode('utf-8'), 2.7)
s = struct.Struct('I 2s f')
packed_data = s.pack(*values)
print('Valeur initiale:', values)
print('Formateur:', s.format)
print('Octets occupés:', s.size)
print('Résultats de l'emballage:', binascii.hexlify(packed_data))
# output
Valeur initiale: (1, b'ab', 2.7)
Formateur: b'I 2s f'
Octets occupés: 12
Résultats de l'emballage: b'0100000061620000cdcc2c40'

Cet exemple convertit une valeur emballée en une séquence d'octets hexadécimaux ,Avecbinascii.hexlify()Méthode d'impression.

Utiliserunpack() Méthode de déballage .

import struct
import binascii
packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40')
s = struct.Struct('I 2s f')
unpacked_data = s.unpack(packed_data)
print(' Résultats du déballage :', unpacked_data)
# output
Résultats du déballage : (1, b'ab', 2.700000047683716)

Passer les valeurs emballées à unpack(), Renvoie essentiellement la même valeur ( Le nombre de points flottants peut varier ).

Ordre des octets/Taille/Aligner

Par défaut,pack Est d'utiliser local C La bibliothèque est codée dans l'ordre des octets . Le premier caractère de la chaîne formatée peut être utilisé pour représenter l'ordre des octets remplis de données 、Taille et alignement, Comme indiqué dans le tableau ci - dessous :

Si elles ne sont pas définies dans le formateur ,Par défaut @.

L'ordre local des octets signifie que l'ordre des octets est déterminé par le système hôte actuel. .Par exemple,:Intel x86EtAMD64(x86-64) Utiliser un ordre de petits octets ; Motorola 68000Et PowerPC G5 Utiliser l'ordre des grands octets .ARMEtIntel Itanium prend en charge la commutation de l'ordre des octets .Peut être utilisésys.byteorder Afficher l'ordre des octets du système actuel .

Taille locale (Size)Et alignement(Alignment)C'est parcCompilateursizeof Expression déterminée . Il correspond à l'ordre local des octets .

La taille standard est déterminée par le formateur , Les tailles standard pour chaque format sont décrites ci - dessous. .

Exemple:

''' Les problèmes rencontrés dans l'étude n'ont pas été résolus?Le petit compilateur a créé unPythonApprentissage et communicationQQGroupe:711312441 À la recherche de petits amis partageant les mêmes idées,S'entraider,Il y a aussi de bons tutoriels d'apprentissage vidéo etPDFLivres électroniques! '''
import struct
import binascii
values = (1, 'ab'.encode('utf-8'), 2.7)
print('Valeur initiale : ', values)
endianness = [
('@', 'native, native'),
('=', 'native, standard'),
('<', 'little-endian'),
('>', 'big-endian'),
('!', 'network'),
]
for code, name in endianness:
s = struct.Struct(code + ' I 2s f')
packed_data = s.pack(*values)
print()
print('Formateur : ', s.format, 'for', name)
print('Octets occupés: ', s.size)
print('Résultats de l'emballage: ', binascii.hexlify(packed_data))
print(' Résultats du déballage : ', s.unpack(packed_data))
# output
Valeur initiale : (1, b'ab', 2.7)
Formateur : b'@ I 2s f' for native, native
Octets occupés: 12
Résultats de l'emballage: b'0100000061620000cdcc2c40'
Résultats du déballage : (1, b'ab', 2.700000047683716)
Formateur : b'= I 2s f' for native, standard
Octets occupés: 10
Résultats de l'emballage: b'010000006162cdcc2c40'
Résultats du déballage : (1, b'ab', 2.700000047683716)
Formateur : b'< I 2s f' for little-endian
Octets occupés: 10
Résultats de l'emballage: b'010000006162cdcc2c40'
Résultats du déballage : (1, b'ab', 2.700000047683716)
Formateur : b'> I 2s f' for big-endian
Octets occupés: 10
Résultats de l'emballage: b'000000016162402ccccd'
Résultats du déballage : (1, b'ab', 2.700000047683716)
Formateur : b'! I 2s f' for network
Octets occupés: 10
Résultats de l'emballage: b'000000016162402ccccd'
Résultats du déballage : (1, b'ab', 2.700000047683716)

Formateur

Le tableau de référence des formats est le suivant: :

Tampon

L'emballage des données en binaires est souvent utilisé dans des scénarios très exigeants en matière de performance. .
Dans de tels scénarios, vous pouvez optimiser en évitant les frais généraux d'attribution de nouveaux tampons à chaque structure d'emballage .
pack_into()Etunpack_from() La méthode prend en charge l'écriture directe dans les tampons préalloués .

import array
import binascii
import ctypes
import struct
s = struct.Struct('I 2s f')
values = (1, 'ab'.encode('utf-8'), 2.7)
print('Valeur initiale:', values)
print()
print('UtiliserctypesModulestring buffer')
b = ctypes.create_string_buffer(s.size)
print('Originalbuffer :', binascii.hexlify(b.raw))
s.pack_into(b, 0, *values)
print(' Écrire les résultats de l'emballage :', binascii.hexlify(b.raw))
print('Déballage :', s.unpack_from(b, 0))
print()
print('UtiliserarrayModule')
a = array.array('b', b'\0' * s.size)
print('Valeur initiale :', binascii.hexlify(a))
s.pack_into(a, 0, *values)
print(' Package Write :', binascii.hexlify(a))
print('Déballage :', s.unpack_from(a, 0))
# output
Valeur initiale: (1, b'ab', 2.7)
UtiliserctypesModulestring buffer
Originalbuffer : b'000000000000000000000000'
Écrire les résultats de l'emballage : b'0100000061620000cdcc2c40'
Déballage : (1, b'ab', 2.700000047683716)
UtiliserarrayModule
Valeur initiale : b'000000000000000000000000'
Package Write : b'0100000061620000cdcc2c40'
Déballage : (1, b'ab', 2.700000047683716)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved