#deflate #inflate

no-std zune-inflate

A heavily optimized deflate decompressor in Pure Rust

12 releases

0.2.54 Apr 30, 2023
0.2.53 Mar 28, 2023
0.2.50 Feb 13, 2023
0.2.42 Jan 15, 2023
0.2.1 Dec 31, 2022

#36 in Compression

Download history 85051/week @ 2023-12-12 81630/week @ 2023-12-19 59798/week @ 2023-12-26 81502/week @ 2024-01-02 85708/week @ 2024-01-09 98551/week @ 2024-01-16 103906/week @ 2024-01-23 117783/week @ 2024-01-30 121247/week @ 2024-02-06 113437/week @ 2024-02-13 115677/week @ 2024-02-20 119039/week @ 2024-02-27 121462/week @ 2024-03-05 115304/week @ 2024-03-12 123666/week @ 2024-03-19 109483/week @ 2024-03-26

488,767 downloads per month
Used in 50 crates (6 directly)

MIT OR Apache-2.0 OR Zlib

130KB
2K SLoC

zune-inflate

This crate features an optimized inflate algorithm supporting whole buffer decompression.

Supported formats are

  • raw deflate
  • zlib (deflate with a zlib wrapper on)
  • gzip

The implementation is heavily based on Eric Biggers libdeflate and hence has similar characteristics.

Specifically, we do not support streaming decompression but prefer whole buffer decompression.

Installation

To use in your crate, simply add the following in your Cargo.toml

[dependencies]
#other amazing crates from other amazing people
zune-inflate = "0.2.0"

Features

One can enable or disable a specific format using cargo features.

Specifically, the following can be enabled

  • gzip: Enable decompressing of gzip encoded data
  • zlib: Enable decompressing of zlib encoded data

To enable one feature, modify Cargo.toml entry to be

[dependencies]
zune-inflate = { version = "0.2", default-features = false, features = ["#ADD_SPECIFIC_FEATURE"] }

Usage.

The library exposes a simple API for decompressing data, and depending on what type of data you have, you typically choose one of the decode[_suffix] function to decode your data

The decompressor expects the whole buffer handed upfront

Decoding raw deflate

To decode raw deflate data, the following code should get you started.

use zune_inflate::DeflateDecoder;
let totally_valid_data = [0; 23];
let mut decoder = DeflateDecoder::new( & totally_valid_data);
// panic on errors, because that's the cool way to go
let decompressed_data = decoder.decode_deflate().unwrap();

Decoding zlib

To decode deflate data wrapped in zlib, the following code should get you started.

use zune_inflate::DeflateDecoder;
let totally_valid_data = [0; 23];
let mut decoder = DeflateDecoder::new( & totally_valid_data);
// panic on errors, because that's the cool way to go
let decompressed_data = decoder.decode_zlib().unwrap();

Advanced usage

There are advanced options specified by DeflateOptions which can change decompression settings.

Comparisions.

I'll compare this with flate2 with miniz-oxide backend.

feature zune-inflate flate2
zlib decompression yes yes
delfate decompression yes yes
gzip yes yes
compression soon yes
streaming decompression no yes
unsafe no yes[1]

[1] Flate writes to an uninitialized buffer

As you can see, there are some concrete features we currently lack when compared to flate2/miniz-oxide.

There's actually nothing riding in for us, except...it's wickedly fast...

Benchmarks

Up-to date benchmarks are done using criterion and hosted online at zune-benchmarks site, benchmarks for this library have the inflate: prefix.

Fuzzing

The decoder is currently fuzzed for correctness by both miniz-oxide and zlib-ng, see the fuzz/src directory

Dependencies