#deflate #zlib #gzip #zlib-ng #encoding #api-bindings

flate2-expose

将DEFLATE压缩和解压缩暴露为Read/BufRead/Write流。支持miniz_oxide和多个zlib实现。支持zlib、gzip和原始deflate流。

2个稳定版本

1.0.25 2022年6月18日

#161 in 压缩

MIT/Apache

205KB
3.5K SLoC

flate2

Crates.io Documentation

一个基于Rust的流式压缩/解压缩库,支持DEFLATE流。

此crate默认使用miniz_oxidecrate,它是纯Rust的miniz.c移植。此crate还支持其他后端,如广泛可用的zlib库或高性能的zlib-ng库。

支持的格式

  • deflate
  • zlib
  • gzip
# Cargo.toml
[dependencies]
flate2 = "1.0"

压缩

use std::io::prelude::*;
use flate2::Compression;
use flate2::write::ZlibEncoder;

fn main() {
    let mut e = ZlibEncoder::new(Vec::new(), Compression::default());
    e.write_all(b"foo");
    e.write_all(b"bar");
    let compressed_bytes = e.finish();
}

解压缩

use std::io::prelude::*;
use flate2::read::GzDecoder;

fn main() {
    let mut d = GzDecoder::new("...".as_bytes());
    let mut s = String::new();
    d.read_to_string(&mut s).unwrap();
    println!("{}", s);
}

后端

默认的miniz_oxide后端的优势在于它是纯Rust。如果你需要最大性能,可以使用zlib-ng C库

[dependencies]
flate2 = { version = "1.0.17", features = ["zlib-ng"], default-features = false }

请注意,即使你的crate图中的其他部分依赖于zlib,"zlib-ng"功能仍然有效。

但是,如果你已经使用其他依赖于zlib的C或Rust库,并且想要避免包含zlib和zlib-ng,你可以将它们用于Rust代码

[dependencies]
flate2 = { version = "1.0.17", features = ["zlib"], default-features = false }

或者,如果你有依赖于zlib的C或Rust代码,并且想要通过libz-sys在zlib-compat模式下使用zlib-ng,使用

[dependencies]
flate2 = { version = "1.0.17", features = ["zlib-ng-compat"], default-features = false }

请注意,当使用"zlib-ng-compat"功能时,如果你的依赖图中的任何crate明确请求标准zlib或直接使用libz-sys而不带default-features = false,则你会得到标准zlib而不是zlib-ng。有关详细信息,请参阅libz-sys的README。为了避免这种情况,请使用"zlib-ng"功能。

为了与之前版本的 flate2 兼容,Cloudflare 提供了优化过的 zlib 版本,通过 cloudflare_zlib 功能。它的速度不如 zlib-ng 快,但比原版 zlib 快。它需要具有 SSE 4.2 的 x86-64 CPU 或具有 NEON & CRC 的 ARM64 CPU。它完全不支持 32 位 CPU,并且与 mingw 不兼容。更多信息请查看 crate 文档。注意,如果您的 crate 图中的任何其他 crate 使用了另一个版本的 zlib/libz,则 cloudflare_zlib 将会导致损坏。

许可证

本项目可在以下任一许可证下使用:

您可选择其中之一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意向提交以包含在本项目中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~0–1MB
~12K SLoC