Inhoud
- 1. Gebruik van de struct module. Verpakte binaire gegevens
- 2. De basismethoden van de struct module
- 2.1. De methoden pack() en unpack(). Inpakken en uitpakken van gegevens
- 2.2. Methode calcsize(). De grootte van het ingepakte object
- 3. Opgemaakte strings
- 3.1. Stel bytevolgorde, grootte en uitlijning in op basis van format karakter
- 3.2. Voorbeelden van opgemaakte strings voor verschillende gegevenstypen
- Gerelateerde onderwerpen
Zoek op andere websites:
1. De module struct gebruiken. Verpakte binaire gegevens
De Python struct-module wordt gebruikt om verpakte binaire gegevens te maken en uit strings te halen. In de struct module worden data bytes geïnterpreteerd als verpakte binaire data die kunnen worden gerepresenteerd door objecten van het type bytes of bytearray.
De module bevat conversie gereedschappen tussen Python waarden en C structuren, die worden gerepresenteerd als Python byte objecten. Dergelijke conversies worden gebruikt bij het verwerken van binaire gegevens die zijn opgeslagen in bestanden of zijn verkregen uit netwerkverbindingen, enz.
Om een compacte beschrijving van C-structuren en conversie naar waarden (van waarden) van Python te bieden, worden format strings gebruikt.
⇑
2. De basismethoden van de struct module
De struct module bevat verschillende basismethoden die u kunt gebruiken om gegevens in te pakken en uit te pakken.
2.1. De methoden pack() en unpack(). Het in- en uitpakken van gegevens
Voor het in- en uitpakken van gegevens worden de methoden pack(), unpack() gebruikt. Het inpakken/uitpakken wordt uitgevoerd volgens de format string.
Volgens de documentatie is de algemene vorm van het gebruik van de methode pack() als volgt
obj = struct.pack(format, v1, v2, ...)
waar
- format – format string. Deze regel wordt gevormd volgens de regels in de tabellen (zie paragraaf 3);
- v1, v2, … – waarden (objecten) die moeten worden ingepakt;
- obj – ingepakt binair object.
De functie unpack() voert de inverse van de operatie pack() uit. Het stelt je in staat om het bronobject te verkrijgen op basis van het ingepakte object. De algemene vorm van het gebruik van de functie is als volgt:
obj = struct.unpack(format, buffer)
hier
- buffer – een buffer waarin een object wordt geschreven dat eerder is ingepakt door de pack() functie. De grootte van dit object moet overeenkomen met de grootte die in format is opgegeven;
- format – een format string op basis waarvan een uitgepakt binair object obj wordt verkregen;
- obj – het resulterende object, dat een lijst, een tuple, een set, een dictionary, etc. kan zijn.
Bij het aanroepen van de functie unpack() moet de format string overeenkomen met dezelfde string die door de functie pack() is opgegeven.
Exemplaar. Ter demonstratie wordt het inpakken/uitpakken van de lijst met getallen uitgevoerd.
# 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)
het resultaat van het programma
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. Methode calcsize(). De grootte van het ingepakte object
De methode calcsize() geeft de grootte terug van het object dat met de methode pack() is gemaakt.
Voorbeeld.
# 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)
Het resultaat van het programma
pack_obj = b'@8Q\xec@y\x99\x9a\xc1(\x00\x00'size = 12pack_obj = b'Helloabcd'size = 9
⇑
3. Geformatteerde strings
3.1. Stel bytevolgorde, grootte en uitlijning in op basis van format teken
In Python wordt de manier waarop een string wordt ingepakt bepaald op basis van het eerste teken van de format tekenreeks. Dit symbool definieert:
- de byte-volgorde, die wordt gevormd met behulp van de tekens @, =, <>, !. Als deze parameter niet wordt opgegeven, wordt het @-symbool geaccepteerd;
- de grootte in bytes van de ingepakte gegevens. In dit geval worden eerst de getallen gebruikt die het aantal aangeven;
- uitlijning, die door het systeem wordt ingesteld.
Volgens de Python documentatie in de format string worden byte-volgorde, grootte en uitlijning gevormd aan de hand van het eerste karakter van het format. De mogelijke eerste karakters van het formaat worden in de volgende tabel getoond.
Character | Byte-volgorde | Size | Alignment |
@ | native (host afhankelijk) | Native | Native |
= | native | standaard | none | < | little-endian | standard | none |
> | big-endian | standard | none |
! | network (= big-endian) | standaard | none |
Een bytevolgordewaarde kan een van de volgende 4 zijn:
- native order. Deze volgorde kan zowel little-endian als big-endian zijn. Deze volgorde wordt bepaald door het host-systeem;
- volgorde van het type little-endian. In deze volgorde wordt eerst de lage byte verwerkt, en daarna de hoge byte;
- volgorde van het type big-endian. In dit geval wordt eerst de high byte verwerkt, en dan de low byte;
- network order, die standaard op big-endian order staat.
De grootte van de ingepakte gegevens kan een van de volgende twee zijn:
- native – gedefinieerd met behulp van de sizeof C-compilerinstructies;
- standard – wordt bepaald op basis van het formaatkarakter in overeenstemming met onderstaande tabel.
Tabel. Definitie van de standaardgrootte van verpakte gegevens afhankelijk van het formaatkarakter
Formaat | C Type | Python Type | Standaardgrootte |
x | pad byte | geen waarde | |
c | char | bytes van lengte 1 | 1 | b | gesigneerde char | integer | 1 |
B | niet-toegewezen char | integer | 1 |
? | _Bool | bool | 1 |
h | short | 2 | |
H | unsigned short | integer | 2 |
int | integer | 4 | |
I | unsigned int | integer | 4 |
l | long | integer | 4 | L | unsigned long | integer | 4 | q | lang | integer | 8 | Q | ongesigneerd lang lang | integer | 8 | n | ssize_t | integer | N | size_t | integer |
e | float (exponentieel formaat) | float | 2 |
f | float | float | 4 |
d | double | float | 8 |
s | char | bytes | |
p | char | bytes | |
P | void* | integer |