4 个稳定版本
使用旧的 Rust 2015
1.0.3 | 2022 年 1 月 30 日 |
---|---|
1.0.1 | 2019 年 6 月 30 日 |
#14 in #最快
479,174 每月下载量
在 845 个crate中使用 (通过 libflate_lz77)
63KB
92 行
rle-decode-fast
与稳定版 Rust 1.53 中的功能相同,请使用该功能
THE 在 Rust 中实现任何类型解码的 Run Length Encoded 数据的 最快 方法。
编写一个既快又安全的解码器可能相当具有挑战性,因此这个 crate 可以为您节省维护和测试自己实现的开销。
用法
当然,您需要依赖于这个 crate
rle-decode-fast = "1.0"
只有一个函数可以使用,rle_decode<T>(&mut Vec<T>, lookbehind_size: usize, fill_length: usize)
. 它接受
- 要修改的向量,
- 从该向量复制项目的数量(基本上是
vector[(vector.len() - lookbehind)..])
- 要追加的项目数量。之后,向量将包含额外的
fill_length
项。
use rle_decode_fast::rle_decode;
let mut decode_buffer = vec![0, 0, 1, 1, 0, 2, 3];
let lookbehind_length = 4;
let output_length = 10;
rle_decode(&mut decode_buffer, lookbehind_length, output_length);
assert_eq!(decode_buffer, [0, 0, 1, 1, 0, 2, 3, 1, 0, 2, 3, 1, 0, 2, 3, 1, 0]);
恐慌
在某些情况下,解码函数会恐慌
- lookbehind 长度为 0
- lookbehind 长度大于 Vec 的长度
- 输出长度 + Vec 的长度会导致溢出
背景
这个crate的构想最初源于这篇预RFC。它引起了人们对标准库中一个弱点的关注,导致一些crate编写了自己的不安全绕过。
在预RFC的探索过程中,进行了一些实验。例如,参见这里和这里。
一些统计数据
有一个基准测试比较了简单的(重复推入)实现、可能导致未初始化内存的脆弱实现以及这个crate。
对于非常短的填充长度,结果如下:,而对于较长的填充长度,结果如下:
许可
许可方式如下
- Apache License,版本2.0 LICENSE-APACHE
- MIT许可 LICENSE-MIT
任选其一。
贡献
除非你明确表示,否则根据Apache-2.0许可证定义,你故意提交的旨在包含在作品中的任何贡献,应按上述方式双许可,不附加任何额外条款或条件。
依赖
~0–8MB
~54K SLoC