deflate — deflate sıkıştırma ve açma¶
Bu modül, ikili verilerin DEFLATE algoritması (yaygın olarak zlib kütüphanesinde ve gzip arşivleyicide kullanılır) ile sıkıştırılmasına ve açılmasına olanak tanır. MicroPython v1.21’de eklenmiştir.
OpenMV tarafından desteklenen kartlardaki kullanılabilirlik:
Kart |
Açma |
Sıkıştırma |
|---|---|---|
OpenMV Cam N6 |
Evet |
Hayır |
OpenMV AE3 |
Evet |
Evet |
OpenMV Cam RT1062 |
Evet |
Evet |
OpenMV Cam Pure Thermal |
Evet |
Hayır |
OpenMV Cam M4 |
Evet |
Hayır |
OpenMV Cam M7 |
Evet |
Hayır |
OpenMV Cam H7 |
Evet |
Hayır |
OpenMV Cam H7 Plus |
Evet |
Hayır |
Arduino Giga |
Evet |
Hayır |
Arduino Portenta H7 |
Evet |
Hayır |
Arduino Nicla Vision |
Evet |
Hayır |
Arduino Nano 33 BLE Sense |
Evet |
Hayır |
Arduino Nano RP2040 Connect |
Evet |
Hayır |
Sınıflar¶
- class deflate.DeflateIO(stream: Any, format: int = AUTO, wbits: int = 0, close: bool = False, /)¶
Bu sınıf, bir dosya, soket veya akış (
io.BytesIOdahil) gibi herhangi bir akış benzeri nesnesi olan bir stream‘i sarmak için kullanılabilir. Kendisi de bir akıştır ve standart read/readinto/write/close yöntemlerini uygular.stream engelleyen (blocking) bir akış olmalıdır. Engellemeyen akışlar şu anda desteklenmemektedir.
format, aşağıda tanımlanan sabitlerden herhangi birine ayarlanabilir ve varsayılan olarak
AUTOdeğerini alır; bu, açma için gzip veya zlib akışlarını otomatik olarak algılar, sıkıştırma için ise ham bir akış üretir.wbits parametresi, DEFLATE sözlük penceresi boyutunun 2 tabanındaki logaritmasını ayarlar. Yani örneğin wbits değerini
10olarak ayarlamak, pencere boyutunu 1024 bayta ayarlar. Geçerli değerler5ila15arasıdır (her ikisi dahil; 32 ila 32k baytlık pencere boyutlarına karşılık gelir).wbits değeri
0(varsayılan) olarak ayarlanırsa, sıkıştırma için 256 baytlık bir pencere boyutu kullanılır (wbits 8 olarak ayarlanmış gibi). Açma için ise format’a bağlıdır:RAW, 256 bayt kullanır (wbits 8 olarak ayarlanmaya karşılık gelir).ZLIB(veya zlib algılanmışAUTO), zlib başlığındaki değeri kullanır.GZIP(veya gzip algılanmışAUTO), 32 kilobayt kullanır (wbits 15 olarak ayarlanmaya karşılık gelir).
Pencere boyutu, zlib ve gzip akışları hakkında daha fazla bilgi için aşağıdaki pencere boyutu notlarına bakın.
close değeri
Trueolarak ayarlanırsa,deflate.DeflateIOakışı kapatıldığında alttaki akış otomatik olarak kapatılır. Bu, başka bir akışı saran birdeflate.DeflateIOakışını döndürmek ve çağıranın alttaki akışı yönetmesi gerektiğini bilmesine gerek bırakmamak istiyorsanız kullanışlıdır.Sıkıştırma etkinse, belirli bir
deflate.DeflateIOörneği hem okuma hem de yazmayı destekler. Örneğin, bir soket gibi çift yönlü bir akış sarılabilir ve bu, her iki yönde de sıkıştırma/açma yapılmasına olanak tanır.
Sabitler¶
Dört format sabiti, ham deflate bit akışının etrafına uygulanan çerçevelemeyi seçer.
- deflate.AUTO: int¶
Açma için, akışın ilk baytlarını inceleyerek girdi format’ını otomatik algılar (zlib veya gzip). Sıkıştırma için, başlık veya kuyruk olmadan ham bir deflate akışı üretir (
RAWile eşdeğer).
- deflate.RAW: int¶
Ham bir deflate akışı (başlık yok, kuyruk yok, sağlama toplamı yok). Akış hiçbir meta veri içermediğinden, açıcı pencere boyutunu veriden kurtaramaz; bu nedenle açma sırasında wbits açıkça ayarlanmalıdır – aksi takdirde varsayılan 256 baytlık pencere çok küçük olabilir.
- deflate.ZLIB: int¶
RFC 1950 ile tanımlandığı şekliyle zlib ile sarılmış bir deflate akışı: pencere boyutunu kaydeden 2 baytlık bir başlık, deflate yükü ve sondaki bir Adler-32 sağlama toplamı. Kompakt ve kendi kendini tanımlayan bu biçim, gömülü kullanım için çok uygundur.
- deflate.GZIP: int¶
RFC 1952 ile tanımlandığı şekliyle gzip ile sarılmış bir deflate akışı: isteğe bağlı dosya adı/zaman damgası meta verisi içeren bir başlık, deflate yükü ve sondaki bir CRC-32 ile sıkıştırılmamış uzunluk. Bu,
gzipkomut satırı aracının vegzip.GzipFilesınıfının ürettiği biçimdir. Başlık pencere boyutunu kaydetmediğinden, wbits ayarlanmadıkça açıcı 32 KiB varsaymak zorundadır.
Örnekler¶
deflate.DeflateIO için tipik bir kullanım örneği, depolamadan sıkıştırılmış bir dosyayı okumak veya yazmaktır:
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.
deflate.DeflateIO bir akış olduğundan, örneğin json.dump() ve json.load() ile (ve akışların kullanılabildiği diğer her yerde) kullanılabilir:
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)
Kaynak verileriniz bir akış biçiminde değilse, onu deflate.DeflateIO ile kullanıma uygun bir akışa dönüştürmek için io.BytesIO kullanabilirsiniz:
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 pencere boyutu¶
Pencere boyutu, (açıcının/sıkıştırıcının) akışta ne kadar geriye referans verebileceğini sınırlar. Pencere boyutunu artırmak sıkıştırmayı iyileştirir, ancak daha fazla bellek gerektirir ve sıkıştırıcıyı yavaşlatır.
Bir girdi akışı belirli bir pencere boyutuyla sıkıştırılmışsa, daha küçük bir pencere boyutu kullanan DeflateIO açma sırasında yarı yolda OSError ile başarısız olur, ancak yalnızca bir geri referans gerçekten açıcının pencere boyutundan daha geriye işaret ediyorsa. Bu, daha küçük bir pencere boyutuyla açmanın mümkün olabileceği anlamına gelir. Örneğin, orijinal sıkıştırılmamış veri pencere boyutundan kısaysa bu durum açıkça geçerli olur.
Açma¶
zlib biçimi, verileri sıkıştırmak için kullanılan pencere boyutunu belirten bir başlık içerir. Bu, bu akışı açmak için gereken maksimum pencere boyutunu gösterir. Bu başlık değeri belirtilen wbits değerinden küçükse (veya wbits ayarlanmamışsa), başlık değeri kullanılır.
gzip biçimi, başlıkta pencere boyutunu içermez ve tüm gzip sıkıştırıcılarının (örneğin gzip yardımcı programı veya CPython’un gzip.GzipFile uygulaması) maksimum 32kiB pencere boyutunu kullandığını varsayar. Bu nedenle, wbits parametresi ayarlanmamışsa, açıcı 32 kiB’lik bir pencere boyutu kullanır (wbits 15 olarak ayarlanmaya karşılık gelir). Bu, rastgele bir gzip akışını açabilmek için en azından bu kadar RAM’inizin bulunması gerektiği anlamına gelir. Kaynak verileri siz kontrol ediyorsanız, bunun yerine daha küçük bir pencere boyutuyla zlib biçimini kullanmayı düşünün.
Ham biçimin başlığı yoktur ve bu nedenle pencere boyutu hakkında hiçbir bilgi içermez. wbits ayarlanmamışsa, varsayılan olarak belirli bir akış için yeterince büyük olmayabilecek 256 baytlık bir pencere boyutu kullanılır. Bu nedenle, ham biçimi kullanıyorsanız wbits değerini her zaman açıkça ayarlamanız önerilir.
Sıkıştırma¶
Sıkıştırma için MicroPython, tüm biçimler için varsayılan olarak 256 baytlık bir pencere boyutu kullanır. Bu, minimum bellek kullanımı ve hızlı sıkıştırma süresiyle makul miktarda sıkıştırma sağlar ve herhangi bir açıcıyla çalışacak çıktı üretir.