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.BytesIO dahil) 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 AUTO değ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 10 olarak ayarlamak, pencere boyutunu 1024 bayta ayarlar. Geçerli değerler 5 ila 15 arası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 True olarak ayarlanırsa, deflate.DeflateIO akışı kapatıldığında alttaki akış otomatik olarak kapatılır. Bu, başka bir akışı saran bir deflate.DeflateIO akışı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 (RAW ile 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, gzip komut satırı aracının ve gzip.GzipFile sı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.