#brotli #解压缩 #霍夫曼 #lz77 #no-std

no-std brotli-ffi

一个与 https://github.com/google/brotli 完全匹配的接口的 brotli 压缩和解压缩器。所有包含的代码都是安全的,除了薄薄的导出 C 兼容函数。

5 个稳定版本

使用旧的 Rust 2015

1.1.2 2022年2月17日
1.1.1 2018年11月25日
1.1.0 2018年11月22日
1.0.1 2018年11月22日
1.0.0 2018年11月6日

#715 in 压缩

24 每月下载量

BSD-3-Clause/MIT

5MB
242K SLoC

rust-brotli

Build Status

  • 一个完全兼容的 FFI,用于与 https://github.com/google/brotli 二进制文件直接兼容
    • 完全支持自定义分配器
  • 多线程压缩,以便多个线程可以同时对单个文件进行操作
  • 可连接性模式,以添加 https://github.com/google/brotli/issues/628 中请求的功能
    • 二进制工具 catbrotli 可以完成此操作,如果第一个文件使用 -apendable 指定,第二个文件使用 -catable 指定
  • 验证模式,其中文件将被双重检查以确认可以使用相同的设置进行解压缩;对于基准测试或模糊测试很有用
  • 魔数:brotli 文件可以具有有用的头部,包含一些魔数字节、可连接性信息和最终输出大小,以便预分配内存

项目要求

将 C brotli 压缩器的直接 no-stdlib 版本移植到 Rust

不依赖于 Rust stdlib:这个库非常适合在 Rust 内核中解压缩,以及其他用途。

这有助于比较 C 和 Rust 在相同算法、数据结构和优化条件下如何比较。

使用 C 接口

rust-brotli 是官方 http://github.com/google/brotli/ C 实现的替代品。这意味着您可以从支持该库的任何位置使用它。要以这种方式构建 rust-brotli,请进入 c 子目录并在那里运行 make

cd c && make

这应该会构建 c/target/release/libbrotli.so,并且应该构建用于压缩和解压缩任何 brotli 文件的 C 的纯命令行工具。

c/target/release 中的 libbrotli.so 应该能够替换任何其他 libbrotli.so 文件,但具有使用安全 rust(除了 FFI 绑定)的所有优点

代码还允许更广泛的选项,包括强制预测模式(例如 UTF8 与有符号与 MSB 与 LSB)以及将字面成本权重从 540 更改为其他值。

此外,还暴露了 CATABLE 和 APPENDABLE 选项,允许以这种方式创建文件的连接。

具体来说,可以使用catbrotli工具以任意顺序连接CATABLE文件,而APPENDABLE文件可以是catable文件序列中的第一个文件... 例如,您可以组合appendable.br、catable1.br、catable2.br、catable3.br

或者简单地catable0.br、catable1.br、catable2.br、catable3.br

多线程压缩

C FFI 允许您创建一个工作池,该工作池可用于压缩多个文件,而无需在每次压缩时重新创建线程

    BrotliEncoderWorkPool *work_pool = BrotliEncoderCreateWorkPool(num_threads != 0 ? num_threads - 1 : 0, NULL /* custom allocator */, NULL, NULL);
    if (!work_pool) {
      return 0;
    }
    size_t out_len = BrotliEncoderMaxCompressedSizeMulti(len, num_threads);
    reinit_vec_u8(ret_buffer, out_len);
    ret = BrotliEncoderCompressWorkPool(
        work_pool,
        num_params,
        param_keys,
        param_values,
        len,
        data,
        &out_len,
        ret_buffer->data,
        num_threads,
        NULL /* custom allocator*/, NULL, NULL);
        
    BrotliEncoderDestroyWorkPool(work_pool);

示例请参见multiexample.c

依赖关系