deflate — deflate kompresija i dekompresija

Ovaj modul omogućuje kompresiju i dekompresiju binarnih podataka pomoću DEFLATE algoritma (uobičajeno korištenog u zlib biblioteci i gzip arhiveru). Dodano u MicroPython v1.21.

Dostupnost na pločama koje podržava OpenMV:

Ploča

Dekompresija

Kompresija

OpenMV Cam N6

Da

Ne

OpenMV AE3

Da

Da

OpenMV Cam RT1062

Da

Da

OpenMV Cam Pure Thermal

Da

Ne

OpenMV Cam M4

Da

Ne

OpenMV Cam M7

Da

Ne

OpenMV Cam H7

Da

Ne

OpenMV Cam H7 Plus

Da

Ne

Arduino Giga

Da

Ne

Arduino Portenta H7

Da

Ne

Arduino Nicla Vision

Da

Ne

Arduino Nano 33 BLE Sense

Da

Ne

Arduino Nano RP2040 Connect

Da

Ne

Klase

class deflate.DeflateIO(stream: Any, format: int = AUTO, wbits: int = 0, close: bool = False, /)

Ova klasa može se koristiti za omatanje stream objekta koji je bilo koji objekt nalik streamu poput datoteke, socketa ili streama (uključujući io.BytesIO). I sama je stream i implementira standardne metode read/readinto/write/close.

stream mora biti blokirajući stream. Neblokirajući streamovi trenutno nisu podržani.

format može se postaviti na bilo koju od dolje definiranih konstanti i zadano je AUTO koji će za dekompresiju automatski prepoznati gzip ili zlib streamove, a za kompresiju će generirati sirovi stream.

Parametar wbits postavlja logaritam po bazi 2 veličine prozora rječnika DEFLATE. Tako, na primjer, postavljanje wbits na 10 postavlja veličinu prozora na 1024 bajta. Valjane vrijednosti su od 5 do 15 uključivo (što odgovara veličinama prozora od 32 do 32k bajta).

Ako je wbits postavljen na 0 (zadano), tada će se za kompresiju koristiti veličina prozora od 256 bajtova (kao da je wbits postavljen na 8). Za dekompresiju ovisi o formatu:

  • RAW će koristiti 256 bajtova (što odgovara wbits postavljenom na 8).

  • ZLIB (ili AUTO s prepoznatim zlibom) koristit će vrijednost iz zlib zaglavlja.

  • GZIP (ili AUTO s prepoznatim gzipom) koristit će 32 kilobajta (što odgovara wbits postavljenom na 15).

Pogledajte napomene o veličini prozora u nastavku za više informacija o veličini prozora te zlib i gzip streamovima.

Ako je close postavljen na True, tada će se temeljni stream automatski zatvoriti kada se zatvori stream deflate.DeflateIO. To je korisno ako želite vratiti deflate.DeflateIO stream koji omata drugi stream, a da pozivatelj ne mora znati za upravljanje temeljnim streamom.

Ako je kompresija omogućena, dana instanca deflate.DeflateIO podržava i čitanje i pisanje. Na primjer, dvosmjerni stream poput socketa može se omotati, što omogućuje kompresiju/dekompresiju u oba smjera.

Konstante

Četiri format konstante odabiru okvir primijenjen oko sirovog deflate bit-streama.

deflate.AUTO: int

Za dekompresiju, automatski prepoznaje ulazni format pregledom prvih bajtova streama (zlib ili gzip). Za kompresiju, generira sirovi deflate stream bez zaglavlja ili završetka (jednako kao RAW).

deflate.RAW: int

Sirovi deflate stream (bez zaglavlja, bez završetka, bez kontrolne sume). Budući da stream ne sadrži metapodatke, dekompresor ne može oporaviti veličinu prozora iz podataka, pa bi wbits trebalo eksplicitno postaviti pri dekompresiji – inače zadani prozor od 256 bajtova može biti premalen.

deflate.ZLIB: int

Deflate stream omotan zlibom kako je definirano u RFC 1950: 2-bajtno zaglavlje koje bilježi veličinu prozora, deflate korisni teret i završna Adler-32 kontrolna suma. Kompaktan i samoopisujući; dobro prikladan za ugrađenu uporabu.

deflate.GZIP: int

Deflate stream omotan gzipom kako je definirano u RFC 1952: zaglavlje s neobaveznim metapodacima o imenu datoteke/vremenskoj oznaci, deflate korisni teret i završni CRC-32 plus nekomprimirana duljina. Ovo je format koji proizvodi naredbeni alat gzip i gzip.GzipFile. Zaglavlje ne bilježi veličinu prozora, pa dekompresor mora pretpostaviti 32 KiB osim ako je wbits postavljen.

Primjeri

Tipičan slučaj uporabe za deflate.DeflateIO je čitanje ili pisanje komprimirane datoteke iz pohrane:

import deflate

# Writing a zlib-compressed stream (uses the default window size of 256 bytes).
with open("data.z", "wb") as f:
    with deflate.DeflateIO(f, deflate.ZLIB) as d:
        # Use d.write(...) etc

# Reading a zlib-compressed stream (auto-detect window size).
with open("data.z", "rb") as f:
    with deflate.DeflateIO(f, deflate.ZLIB) as d:
        # Use d.read(), d.readinto(), etc.

Budući da je deflate.DeflateIO stream, može se koristiti na primjer s json.dump() i json.load() (i na svim drugim mjestima gdje se streamovi mogu koristiti):

import deflate, json

# Write a dictionary as JSON in gzip format, with a
# small (64 byte) window size.
config = { ... }
with open("config.gz", "wb") as f:
    with deflate.DeflateIO(f, deflate.GZIP, 6) as f:
        json.dump(config, f)

# Read back that dictionary.
with open("config.gz", "rb") as f:
    with deflate.DeflateIO(f, deflate.GZIP, 6) as f:
        config = json.load(f)

Ako vaši izvorni podaci nisu u stream formatu, možete koristiti io.BytesIO da ih pretvorite u stream prikladan za uporabu s deflate.DeflateIO:

import deflate, io

# Decompress a bytes/bytearray value.
compressed_data = get_data_z()
with deflate.DeflateIO(io.BytesIO(compressed_data), deflate.ZLIB) as d:
    decompressed_data = d.read()

# Compress a bytes/bytearray value.
uncompressed_data = get_data()
stream = io.BytesIO()
with deflate.DeflateIO(stream, deflate.ZLIB) as d:
    d.write(uncompressed_data)
compressed_data = stream.getvalue()

Veličina prozora deflate

Veličina prozora ograničava koliko unazad u streamu (de)kompresor može referencirati. Povećanje veličine prozora poboljšat će kompresiju, ali će zahtijevati više memorije i učiniti kompresor sporijim.

Ako je ulazni stream komprimiran danom veličinom prozora, tada će DeflateIO koji koristi manju veličinu prozora podbaciti tijekom dekompresije s OSError, ali samo ako se povratna referenca zaista odnosi unazad dalje od veličine prozora dekompresora. To znači da je možda moguće dekompresirati s manjom veličinom prozora. Na primjer, to bi trivijalno bio slučaj ako su izvorni nekomprimirani podaci kraći od veličine prozora.

Dekompresija

zlib format uključuje zaglavlje koje navodi veličinu prozora korištenu za kompresiju podataka. To ukazuje na maksimalnu veličinu prozora potrebnu za dekompresiju ovog streama. Ako je ta vrijednost zaglavlja manja od navedene vrijednosti wbits (ili ako wbits nije postavljen), tada će se koristiti vrijednost zaglavlja.

gzip format ne uključuje veličinu prozora u zaglavlju i pretpostavlja da svi gzip kompresori (npr. uslužni program gzip ili CPythonova implementacija gzip.GzipFile) koriste maksimalnu veličinu prozora od 32kiB. Iz tog razloga, ako parametar wbits nije postavljen, dekompresor će koristiti veličinu prozora od 32 kiB (što odgovara wbits postavljenom na 15). To znači da za mogućnost dekompresije proizvoljnog gzip streama morate imati barem toliko dostupnog RAM-a. Ako kontrolirate izvorne podatke, razmotrite umjesto toga korištenje zlib formata s manjom veličinom prozora.

Sirovi format nema zaglavlje i stoga ne uključuje nikakve informacije o veličini prozora. Ako wbits nije postavljen, zadat će se na veličinu prozora od 256 bajtova, što možda nije dovoljno veliko za dani stream. Stoga se preporučuje da uvijek eksplicitno postavite wbits ako koristite sirovi format.

Kompresija

Za kompresiju, MicroPython će kao zadano koristiti veličinu prozora od 256 bajtova za sve formate. To pruža razumnu količinu kompresije uz minimalno korištenje memorije i brzo vrijeme kompresije te će generirati izlaz koji će raditi s bilo kojim dekompresorom.