#长度 #解码 #运行 #编码 #类型 #最快 #数据

已弃用 rle-decode-fast

已弃用:自 Rust 1.53 起稳定版中可用,请使用 Vec::extend_from_within()。之前,这是在 Rust 中实现任何类型解码的 Run Length Encoded 数据的最快方式

4 个稳定版本

使用旧的 Rust 2015

1.0.3 2022 年 1 月 30 日
1.0.1 2019 年 6 月 30 日

#14 in #最快

Download history 117076/week @ 2024-03-14 114500/week @ 2024-03-21 130788/week @ 2024-03-28 116705/week @ 2024-04-04 123051/week @ 2024-04-11 118097/week @ 2024-04-18 111335/week @ 2024-04-25 105189/week @ 2024-05-02 111111/week @ 2024-05-09 117531/week @ 2024-05-16 127176/week @ 2024-05-23 118551/week @ 2024-05-30 116824/week @ 2024-06-06 126023/week @ 2024-06-13 119685/week @ 2024-06-20 95687/week @ 2024-06-27

479,174 每月下载量
845 个crate中使用 (通过 libflate_lz77)

MIT/Apache

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。

对于非常短的填充长度,结果如下:lookbehind=333,而对于较长的填充长度,结果如下:lookbehind=2

许可

许可方式如下

任选其一。

贡献

除非你明确表示,否则根据Apache-2.0许可证定义,你故意提交的旨在包含在作品中的任何贡献,应按上述方式双许可,不附加任何额外条款或条件。

依赖

~0–8MB
~54K SLoC