#base64-encode #decode-base64 #codec #utf-8 #byte #versions #compatibility

base64-compat

以字节或UTF-8编码和解码base64 - 与较旧版本的Rust兼容

2个版本 (1 个稳定版)

使用旧的Rust 2015

1.0.0 2019年9月12日
0.1.0 2019年9月12日

#432编码

Download history 3359/week @ 2023-11-19 3141/week @ 2023-11-26 3220/week @ 2023-12-03 3088/week @ 2023-12-10 2772/week @ 2023-12-17 1441/week @ 2023-12-24 1854/week @ 2023-12-31 2156/week @ 2024-01-07 2775/week @ 2024-01-14 2651/week @ 2024-01-21 3091/week @ 2024-01-28 2893/week @ 2024-02-04 2680/week @ 2024-02-11 2969/week @ 2024-02-18 3109/week @ 2024-02-25 3384/week @ 2024-03-03

12,371 每月下载量
用于 27 个crate (15 个直接使用)

MIT/Apache

155KB
3K SLoC

base64-compat

Docs Build codecov

这就是base64。还有什么是人们想要的吗?

可能是一个稳定的API以及与较新Rust版本的兼容性?

本项目是 rust-base64 的分支,支持较旧版本的Rust。


此库的目标是 正确快速。经过彻底测试和广泛使用。它以多个抽象级别公开功能,因此您可以选择所需方便性和性能之间的平衡,例如 decode_config_slice 将解码到现有的 &mut [u8],并且非常快(3 KiB输入的2.6GiB/s),而 decode_config 则分配一个新的 Vec<u8> 并返回它,这在某些情况下可能更方便,但速度较慢(尽管对于大多数用途来说仍然足够快)在 2.1 GiB/s。

示例

Cargo.toml 行: base64-compat = "1.0.0"

extern crate base64;

use base64::{encode, decode};

fn main() {
    let a = b"hello world";
    let b = "aGVsbG8gd29ybGQ=";

    assert_eq!(encode(a), b);
    assert_eq!(a, &decode(b).unwrap()[..]);
}

有关所有详细信息的文档

Rust版本兼容性

最低要求的Rust版本是1.19.0。

开发

基准测试在 benches/ 中。运行它们需要nightly rust,但 rustup 可以轻松完成

rustup run nightly cargo bench

解码得到了一些预先计算表的辅助,这些表是通过

cargo run --example make_tables > src/tables.rs.tmp && mv src/tables.rs.tmp src/tables.rs

性能分析

在Linux上,您可以使用 perf 进行性能分析。然后使用 rustup nightly run cargo bench --no-run 编译基准测试。

使用 perf 运行基准二进制文件(此处显示为筛选特定的基准,这将使结果更易于阅读)。在大多数系统中,由于它需要操作 CPU 中的事件计数器,因此 perf 只对 root 用户可用,所以需要使用 sudo。我们需要运行实际的基准二进制文件,因此路径进入 target。您可以使用 rustup run nightly cargo bench -v 查看实际的完整路径;它将打印出它运行的命令。如果您使用 bench 输出的确切路径,请确保您得到的是用于基准测试的路径,而不是测试路径。您可能还想要运行 cargo clean,以便只有一个 benchmarks- 二进制文件(它们往往会累积)。

sudo perf record target/release/deps/benchmarks-* --bench decode_10mib_reuse

然后使用 perf 分析结果

sudo perf annotate -l

您会看到一堆交织的 rust 源代码和汇编代码,如下所示。带有 lib.rs:327 的部分告诉我们,4.02% 的样本看到了 movzbl 也称为位移动作为活动的指令。然而,由于称为 skid 的现象,这个百分比并不像看起来那么精确。基本上,现代 CPU 的复杂性导致这种指令分析本质上是不准确的,尤其是在分支密集型代码中。

 lib.rs:322    0.70 :     10698:       mov    %rdi,%rax
    2.82 :        1069b:       shr    $0x38,%rax
         :                  if morsel == decode_tables::INVALID_VALUE {
         :                      bad_byte_index = input_index;
         :                      break;
         :                  };
         :                  accum = (morsel as u64) << 58;
 lib.rs:327    4.02 :     1069f:       movzbl (%r9,%rax,1),%r15d
         :              // fast loop of 8 bytes at a time
         :              while input_index < length_of_full_chunks {
         :                  let mut accum: u64;
         :
         :                  let input_chunk = BigEndian::read_u64(&input_bytes[input_index..(input_index + 8)]);
         :                  morsel = decode_table[(input_chunk >> 56) as usize];
 lib.rs:322    3.68 :     106a4:       cmp    $0xff,%r15
         :                  if morsel == decode_tables::INVALID_VALUE {
    0.00 :        106ab:       je     1090e <base64::decode_config_buf::hbf68a45fefa299c1+0x46e>

模糊测试

这使用 cargo-fuzz。有关可用的模糊测试脚本,请参阅 fuzz/fuzzers。要运行,请使用以下调用之一

cargo +nightly fuzz run roundtrip
cargo +nightly fuzz run roundtrip_no_pad
cargo +nightly fuzz run roundtrip_random_config -- -max_len=10240
cargo +nightly fuzz run decode_random

许可证

本项目是 rust-base64 项目的分支,该项目在 MIT 和 Apache 2.0 许可下双许可。因此,本项目也在 MIT 和 Apache 2.0 许可下双许可。

依赖关系