struct-moduuli Pythonissa
The struct-moduuli sisään Python voit työskennellä binääritietojen kanssa tarjoamalla toimintoja Python-arvojen ja C-tyylisten binääritietojen muuntamiseen. Tämä on erityisen hyödyllistä, kun käsitellään binääritiedostomuotoja tai verkkoprotokollia. Sen tärkeimpiä ominaisuuksia ovat:
- Pakkaus muuntaa Python-arvot binääritiedoiksi (tavuiksi).
- Purkaminen muuntaa binääritiedot takaisin Python-arvoiksi.
- Muotoile merkkijonot määrittää, kuinka tiedot pakataan/purkataan muotokoodeilla (esim. i kokonaisluvuille f kelluville).
Menetelmät tiedostossa struct.pack()
1.Struct.pack(): Se muuntaa Python-arvot pakattuun binaarimuotoon. Muotomerkkijono (fmt) määrittää pakattujen tietojen asettelun ja seuraavat arvot (v1 v2 ...) pakataan tämän muodon mukaan. Syntaksi:
struct.pack(fmt v1 v2 ...)
- fmt : Muotomerkkijono, joka määrittää, kuinka tiedot pakataan.
- v1 v2...: Arvot, jotka pakataan määritetyn muodon mukaan.
import struct # pack values into binary var = struct . pack ( 'hhl' 1 2 3 ) print ( var ) var = struct . pack ( 'iii' 1 2 3 ) print ( var )
Lähtö
b'x01x00x02x00x00x00x00x00x03x00x00x00x00x00x00x00' b'x01x00x00x00x02x00x00x00x03x00x00x00'
Selitys: 'hhl' tarkoittaa kahta lyhyttä kokonaislukua (h 2 tavua kumpikin), jota seuraa pitkä (l yleensä 4 tai 8 tavua alustasta riippuen). 'iii' pakkaa kolme 4-tavuista kokonaislukua. Tulos on tavuissa (b''), jotka edustavat arvojen binaarista koodausta.
2.struct.unpack(): Se muuntaa pakatut binääritiedot takaisin Python-arvoiksi. Se ottaa muotomerkkijonon (fmt) ja pakatun binäärimerkkijonon ja palauttaa joukon pakkaamattomia arvoja. Syntaksi:
struct.unpack(fmt string)
- fmt: Muotomerkkijono, joka määrittää, kuinka tiedot tulee purkaa.
- merkkijono: Pakatut binaaritiedot, jotka on purettava.
import struct var = struct . pack ( '?hil' True 2 5 445 ) print ( var ) tup = struct . unpack ( '?hil' var ) print ( tup ) var = struct . pack ( 'qf' 5 2.3 ) print ( var ) tup = struct . unpack ( 'qf' var ) print ( tup )
Lähtö
b'x01x00x02x00x05x00x00x00xbdx01x00x00x00x00x00x00' (True 2 5 445) b'x05x00x00x00x00x00x00x0033x13@' (5 2.299999952316284)
Selitys: Tämä esimerkki pakkaa ensin boolen (?), lyhyen (h) kokonaisluvun (i) ja pitkän (l) tavuiksi. Sitten struct.unpack() muuntaa sen takaisin Python-arvoiksi. Toinen osa pakkaa pitkän pitkän kokonaisluvun (q) ja kellukkeen (f) ja purkaa ne sitten takaisin. Huomaa, kuinka 2.3:sta tulee 2,299999952... kelluntatarkkuuden vuoksi.
3. struct.calcsize(): Se palauttaa muotomerkkijonoa vastaavan rakenteen koon (tavuina). Se on hyödyllinen määritettäessä, kuinka paljon tilaa tarvitaan pakattujen tietojen tallentamiseen. Syntaksi:
struct.calcsize(fmt)
- fmt: muotomerkkijono, joka määrittää tietojen asettelun.
import struct print ( struct . calcsize ( '?hil' )) print ( struct . calcsize ( 'qf' ))
Lähtö
16 12
Selitys: '?hilja' vaatii 16 tavua ja 'qf' tarvitsee 12 tavua kohdistuksesta ja alustasta riippuen.
4. struct.pack_into() ja struct.unpack_from(): Näiden menetelmien avulla voit pakata ja purkaa tietoja suoraan puskuriin/puskurista alkaen annetusta siirrosta. Nämä ovat erityisen hyödyllisiä käsiteltäessä ennalta varattuja muistipuskureita tai kun työskennellään muistiin tallennettujen binääritietojen kanssa.
Kohteen struct.pack_into() syntaksi:
struct.pack_into(fmt puskurin offset v1 v2 ...)
- fmt: muotomerkkijono, joka määrittää tietojen asettelun.
- puskuri: kirjoitettava puskuri (esim. ctypes.create_string_buffer).
- offset: Puskurin aloituskohta, josta pakkaus alkaa.
- v1 v2 ...: puskuriin pakattavat arvot.
Syntaksi struct.unpack_from():
struct.unpack_from(fmt buffer offset=0)
- fmt: Tietojen asettelun määrittävä muotomerkkijono.
- puskuri: Puskuri, joka sisältää pakatut tiedot.
- offset: Lähtökohta, josta purkaminen alkaa (valinnainen)
import struct import ctypes # Allocate buffer size = struct . calcsize ( 'hhl' ) buff = ctypes . create_string_buffer ( size ) # Pack into buffer struct . pack_into ( 'hhl' buff 0 2 2 3 ) # Unpack from buffer res = struct . unpack_from ( 'hhl' buff 0 ) print ( res )
Lähtö
(2 2 3)
Selitys: Tässä puskuri luodaan käyttämällä ctypes. struct.pack_into() lisää arvot tähän puskuriin määritetyllä siirtymällä (tässä tapauksessa 0). struct.unpack_from() sitten lukee tiedot takaisin puskurista.
Muotojärjestyksen vaikutus
Muotomerkkien järjestys voi muuttaa pakattua tulostetta täytetyksen ja tasauksen vuoksi. Tämä vaikuttaa sekä tuloksen tavusisältöön että kokoon.
Python import struct var = struct . pack ( 'bi' 56 0x12131415 ) print ( var ) print ( struct . calcsize ( 'bi' )) var = struct . pack ( 'ib' 0x12131415 56 ) print ( var ) print ( struct . calcsize ( 'ib' ))
Lähtö
b'8x00x00x00x15x14x13x12' 8 b'x15x14x13x128' 5
Selitys: 'bi' (tavu int) saattaa sisältää täyttöä tavun jälkeen "ib" (int tavu) ei sitä tarvitse. Kokoero (8 vs 5) osoittaa, kuinka kohdistus vaikuttaa muistin asetteluun.
Käsittelyvirheet
Jos struct.pack():n kanssa käytetään väärää tietotyyppiä, tapahtuu struct.error. Käytä try-paitsi käsitelläksesi tällaisia tapauksia turvallisesti.
Python import struct try : struct . pack ( 'h' 'invalid' ) # Wrong type 'invalid' is a string but 'h' expects an integer except struct . error as e : print ( f 'Struct Error: { e } ' )
Lähtö
Struct Error: required argument is not an integer
Selitys: Tämä näyttää virheiden käsittelyn käytettäessä structia. 'h' odottaa lyhyttä kokonaislukua, mutta merkkijono ('invalid') annetaan, mikä aiheuttaa struct.error-virheen. Yritä paitsi -lohko kaappaa virheen ja tulostaa merkityksellisen viestin.
Viite https://docs.python.org/2/library/struct.html
Luo tietokilpailu