deflate — deflate tömörítés és kicsomagolás¶
Ez a modul lehetővé teszi a bináris adatok tömörítését és kicsomagolását a DEFLATE algoritmussal (amelyet gyakran használ a zlib könyvtár és a gzip archiváló). A MicroPython v1.21-ben került hozzáadásra.
Elérhetőség az OpenMV által támogatott lapokon:
Lap |
Kicsomagolás |
Tömörítés |
|---|---|---|
OpenMV Cam N6 |
Igen |
Nem |
OpenMV AE3 |
Igen |
Igen |
OpenMV Cam RT1062 |
Igen |
Igen |
OpenMV Cam Pure Thermal |
Igen |
Nem |
OpenMV Cam M4 |
Igen |
Nem |
OpenMV Cam M7 |
Igen |
Nem |
OpenMV Cam H7 |
Igen |
Nem |
OpenMV Cam H7 Plus |
Igen |
Nem |
Arduino Giga |
Igen |
Nem |
Arduino Portenta H7 |
Igen |
Nem |
Arduino Nicla Vision |
Igen |
Nem |
Arduino Nano 33 BLE Sense |
Igen |
Nem |
Arduino Nano RP2040 Connect |
Igen |
Nem |
Osztályok¶
- class deflate.DeflateIO(stream: Any, format: int = AUTO, wbits: int = 0, close: bool = False, /)¶
Ez az osztály egy stream becsomagolására használható, amely bármilyen stream-szerű objektum lehet, például fájl, socket vagy stream (beleértve az
io.BytesIOobjektumot). Maga is egy stream, és megvalósítja a szabványos read/readinto/write/close metódusokat.A stream-nek blokkoló streamnek kell lennie. A nem blokkoló streamek jelenleg nem támogatottak.
A format az alább definiált konstansok bármelyikére beállítható, és alapértelmezetten
AUTO, amely kicsomagoláskor automatikusan felismeri a gzip vagy zlib streameket, tömörítéskor pedig nyers streamet generál.A wbits paraméter a DEFLATE szótár ablakméretének 2-es alapú logaritmusát állítja be. Például a wbits
10-re állítása az ablakméretet 1024 bájtra állítja. Az érvényes értékek5-től15-ig terjednek (a 32 és 32k bájt közötti ablakméreteknek megfelelően).Ha a wbits
0-ra van állítva (ez az alapértelmezés), akkor tömörítéshez 256 bájtos ablakméretet használ (mintha a wbits 8-ra lenne állítva). Kicsomagoláshoz a formátumtól függ:A
RAW256 bájtot fog használni (a wbits 8-ra állításának megfelelően).A
ZLIB(vagyAUTOzlib felismerése esetén) a zlib fejlécben szereplő értéket fogja használni.A
GZIP(vagyAUTOgzip felismerése esetén) 32 kilobájtot fog használni (a wbits 15-re állításának megfelelően).
Az ablakméretre, a zlib és gzip streamekre vonatkozó további információkért lásd az ablakméret alábbi megjegyzéseit.
Ha a close értéke
True, akkor az alapul szolgáló stream automatikusan bezáródik, amikor adeflate.DeflateIOstream bezárul. Ez akkor hasznos, ha egy másik streamet becsomagolódeflate.DeflateIOstreamet szeretnél visszaadni anélkül, hogy a hívónak ismernie kellene az alapul szolgáló stream kezelését.Ha a tömörítés engedélyezve van, egy adott
deflate.DeflateIOpéldány egyszerre támogatja az olvasást és az írást is. Például egy kétirányú stream, mint egy socket, becsomagolható, ami mindkét irányban lehetővé teszi a tömörítést/kicsomagolást.
Konstansok¶
A négy format konstans a nyers deflate bitfolyam köré alkalmazott keretezést választja ki.
- deflate.AUTO: int¶
Kicsomagoláshoz automatikusan felismeri a bemeneti formátumot a stream első bájtjainak vizsgálatával (zlib vagy gzip). Tömörítéshez fejléc vagy záró rész nélküli nyers deflate streamet generál (egyenértékű a
RAWhasználatával).
- deflate.RAW: int¶
Egy nyers deflate stream (fejléc, záró rész és ellenőrzőösszeg nélkül). Mivel a stream nem tartalmaz metaadatot, a kicsomagoló nem tudja visszanyerni az ablakméretet az adatból, ezért a wbits értékét kicsomagoláskor kifejezetten be kell állítani – különben az alapértelmezett 256 bájtos ablak túl kicsi lehet.
- deflate.ZLIB: int¶
Egy zlib-be csomagolt deflate stream, az RFC 1950 szerint definiálva: egy 2 bájtos fejléc, amely rögzíti az ablakméretet, a deflate hasznos adat, és egy záró Adler-32 ellenőrzőösszeg. Kompakt és önleíró; jól alkalmas beágyazott felhasználásra.
- deflate.GZIP: int¶
Egy gzip-be csomagolt deflate stream, az RFC 1952 szerint definiálva: egy fejléc opcionális fájlnév/időbélyeg metaadatokkal, a deflate hasznos adat, és egy záró CRC-32 plusz a kicsomagolt hossz. Ezt a formátumot állítja elő a
gzipparancssori eszköz és agzip.GzipFile. A fejléc nem rögzíti az ablakméretet, ezért a kicsomagolónak 32 KiB-ot kell feltételeznie, hacsak a wbits nincs beállítva.
Példák¶
A deflate.DeflateIO tipikus felhasználási esete egy tömörített fájl olvasása vagy írása a tárolóból:
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.
Mivel a deflate.DeflateIO egy stream, használható például a json.dump() és a json.load() metódusokkal (és bárhol máshol, ahol streamek használhatók):
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)
Ha a forrásadataid nincsenek stream formátumban, az io.BytesIO segítségével a deflate.DeflateIO használatára alkalmas streammé alakíthatod őket:
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()
Deflate ablakméret¶
Az ablakméret korlátozza, hogy a (ki)tömörítő milyen messzire hivatkozhat vissza a streamben. Az ablakméret növelése javítja a tömörítést, de több memóriát igényel, és lassítja a tömörítőt.
Ha egy bemeneti streamet egy adott ablakmérettel tömörítettek, akkor egy kisebb ablakméretet használó DeflateIO a kicsomagolás közepén OSError kivétellel meghiúsul, de csak akkor, ha egy visszahivatkozás valóban messzebbre mutat, mint a kicsomagoló ablakmérete. Ez azt jelenti, hogy lehetséges lehet kisebb ablakmérettel kicsomagolni. Például ez triviálisan így lenne, ha az eredeti kicsomagolt adat rövidebb, mint az ablakméret.
Kicsomagolás¶
A zlib formátum tartalmaz egy fejlécet, amely megadja az adat tömörítéséhez használt ablakméretet. Ez jelzi a stream kicsomagolásához szükséges maximális ablakméretet. Ha ez a fejlécérték kisebb a megadott wbits értéknél (vagy ha a wbits nincs beállítva), akkor a fejlécértéket használja.
A gzip formátum nem tartalmazza az ablakméretet a fejlécben, és azt feltételezi, hogy minden gzip tömörítő (pl. a gzip segédprogram vagy a CPython gzip.GzipFile megvalósítása) a maximális, 32 KiB-os ablakméretet használja. Ezért, ha a wbits paraméter nincs beállítva, a kicsomagoló 32 KiB-os ablakméretet fog használni (a wbits 15-re állításának megfelelően). Ez azt jelenti, hogy egy tetszőleges gzip stream kicsomagolásához legalább ennyi RAM-nak rendelkezésre kell állnia. Ha te uralod a forrásadatot, fontold meg inkább a zlib formátum használatát kisebb ablakmérettel.
A nyers formátumnak nincs fejléce, ezért semmilyen információt nem tartalmaz az ablakméretről. Ha a wbits nincs beállítva, akkor alapértelmezetten 256 bájtos ablakméretet használ, ami egy adott streamhez lehet, hogy nem elég nagy. Ezért ajánlott a wbits értékét mindig kifejezetten beállítani, ha a nyers formátumot használod.
Tömörítés¶
Tömörítéshez a MicroPython minden formátum esetén alapértelmezetten 256 bájtos ablakméretet használ. Ez ésszerű mértékű tömörítést biztosít minimális memóriahasználattal és gyors tömörítési idővel, és olyan kimenetet generál, amely bármely kicsomagolóval működik.