#brotli #解压缩 #io-read #编解码器 #API绑定 #读写

brotlic

提供对brotli库的绑定,包括低开销的编码器和解码器,支持在可自定义的压缩质量和窗口大小下进行压缩和解压缩的io::Write和io::Read包装器

15个不稳定版本

0.8.2 2024年1月27日
0.8.1 2023年1月8日
0.8.0 2022年8月14日
0.7.0 2022年5月2日

#32压缩

Download history 269/week @ 2024-04-22 691/week @ 2024-04-29 352/week @ 2024-05-06 220/week @ 2024-05-13 363/week @ 2024-05-20 199/week @ 2024-05-27 242/week @ 2024-06-03 303/week @ 2024-06-10 263/week @ 2024-06-17 410/week @ 2024-06-24 597/week @ 2024-07-01 431/week @ 2024-07-08 557/week @ 2024-07-15 582/week @ 2024-07-22 640/week @ 2024-07-29 722/week @ 2024-08-05

2,505 每月下载量
用于 3 个crate(直接使用2个)

MIT/Apache

1.5MB
21K SLoC

C 19K SLoC // 0.1% comments Rust 2K SLoC

Brotlic

Crates.io docs.rs GitHub Workflow Status License

Brotlic(或BrotliC)是围绕brotli的一个薄包装。

目录

要求

构建brotli需要C编译器。

用法

Brotlic提供了对所有压缩和解压缩API的Rust绑定。支持对BufReadWrite的即时压缩和解压缩,通过CompressorReader<R>CompressorWriter<W>DecompressorReader<R>DecompressorWriter<W>。对于底层实例,请参阅BrotliEncoderBrotliDecoder。这些可以通过BrotliEncoderOptionsBrotliDecoderOptions分别进行配置。

处理BufRead

  • DecompressorReader<R> - 读取brotli压缩的输入流并对其进行解压缩。
  • CompressorReader<R> - 读取流并在读取的同时对其进行压缩。

处理Write

  • CompressorWriter<W> - 将brotli压缩数据写入底层写入器。
  • DecompressorWriter<W> - 将brotli解压缩数据写入底层writer。

为了简化这个决策,下表概述了所有差异

输入 输出 包装
CompressorReader<R> 未压缩 压缩 BufRead
DecompressorReader<R> 压缩 未压缩 BufRead
CompressorWriter<W> 未压缩 压缩 写入
DecompressorWriter<W> 压缩 未压缩 写入

使用brotli压缩文件

use std::fs::File;
use std::io::{self, Write};
use brotlic::CompressorWriter;

let mut input = File::open("test.txt")?; // uncompressed text file
let mut output = File::create("test.brotli")?; // compressed text output file
let mut output_compressed = CompressorWriter::new(output);

output_compressed.write_all(b"test")?;

解压缩相同的文件

use std::fs::File;
use std::io::{self, BufReader, Read};
use brotlic::DecompressorReader;

let mut input = BufReader::new(File::open("test.brotli")?); // uncompressed text file
let mut input_decompressed = DecompressorReader::new(input); // requires BufRead

let mut text = String::new();
input_decompressed.read_to_string(&mut text)?;

assert_eq!(text, "test");

在内存中压缩和解压缩

use std::io::{self, Read, Write};
use brotlic::{CompressorWriter, DecompressorReader};

let input = vec![0; 1024];

// create a wrapper around Write that supports on the fly brotli compression.
let mut compressor = CompressorWriter::new(Vec::new()); // write to memory
compressor.write_all(input.as_slice());
let encoded_input = compressor.into_inner()?; // read to vec

// create a wrapper around BufRead that supports on the fly brotli decompression.
let mut decompressed_reader = DecompressorReader::new(encoded_input);
let mut decoded_input = Vec::new();

decompressed_reader.read_to_end(&mut decoded_input)?;

assert_eq!(input, decoded_input);

有时可以通过自定义压缩质量以换取更好的压缩比,从而在运行时成本和压缩比之间进行权衡

use brotlic::{BlockSize, BrotliEncoderOptions, CompressorWriter, Quality, WindowSize};

let encoder = BrotliEncoderOptions::new()
    .quality(Quality::best())
    .window_size(WindowSize::best())
    .block_size(BlockSize::best())
    .build()?;

let writer = Vec::new();
let compressed_writer = CompressorWriter::with_encoder(encoder, writer);

建议不要直接使用编码器,而是将其传递给更高级的抽象,如CompressorWriter<W>DecompressorReader<R>

性能

Brotlic的性能与rust-brotli库相当

要自行测试,请运行cargo bench。这将使用不同大小和不同熵的输入来比较该库和rust brotli库的性能。

许可

根据您的要求,受以下任一协议许可

任选其一。

贡献

除非您明确表示,否则根据Apache-2.0许可中定义的,您提交的旨在包含在作品中并由您有意提交的任何贡献,将如上所述双重许可,而无需任何额外条款或条件。

致谢

依赖关系