Rust Base36编解码库base36的使用,支持高效数字与Base36字符串的相互转换

Rust Base36编解码库base36的使用,支持高效数字与Base36字符串的相互转换

安装

在你的项目目录中运行以下Cargo命令:

cargo add base36

或者在你的Cargo.toml中添加以下行:

base36 = "0.0.1"

使用示例

以下是一个完整的Base36编解码示例:

use base36::{encode, decode};

fn main() {
    // 数字转Base36字符串
    let num = 123456789;
    let encoded = encode(num);
    println!("数字 {} 的Base36编码是: {}", num, encoded);  // 输出: 21i3v9
    
    // Base36字符串转数字
    let decoded = decode(&encoded).unwrap();
    println!("Base36字符串 {} 解码后的数字是: {}", encoded, decoded);  // 输出: 123456789
    
    // 错误处理示例
    match decode("invalid!") {
        Ok(num) => println!("解码结果: {}", num),
        Err(e) => println!("解码错误: {}", e),  // 输出: 解码错误: Invalid character '!' at position 6
    }
}

功能说明

  1. encode(num: u64) -> String - 将无符号64位整数编码为Base36字符串
  2. decode(s: &str) -> Result<u64, String> - 将Base36字符串解码为无符号64位整数,返回Result类型

注意事项

  • 该库仅支持无符号64位整数(u64)的编解码
  • Base36字符串不区分大小写,但编码结果总是小写字母
  • 解码时遇到非法字符会返回错误

性能特点

  • 编码和解码操作都是O(n)时间复杂度
  • 无堆分配(除了返回的String)
  • 无系统调用
  • 无外部依赖

完整示例代码

// 引入base36库中的编解码函数
use base36::{encode, decode};

fn main() {
    // 示例1: 基本编码解码
    let number = 987654321;
    let encoded_str = encode(number);
    println!("[基本示例]");
    println!("原始数字: {}", number);
    println!("编码结果: {}", encoded_str);
    println!("解码结果: {}\n", decode(&encoded_str).unwrap());

    // 示例2: 边界值测试
    let max_num = u64::MAX;
    println!("[边界值测试]");
    println!("最大u64值: {}", max_num);
    println!("编码结果: {}", encode(max_num));
    println!("解码结果: {}\n", decode(&encode(max_num)).unwrap());

    // 示例3: 错误处理
    println!("[错误处理]");
    let invalid_str = "hello@world";
    match decode(invalid_str) {
        Ok(n) => println!("解码成功: {}", n),
        Err(e) => println!("解码失败: {}", e),
    }
    
    // 示例4: 大小写不敏感测试
    println!("\n[大小写测试]");
    let mixed_case = "21I3V9";
    println!("混合大小写输入: {}", mixed_case);
    println!("解码结果: {}", decode(mixed_case).unwrap());
}

输出结果示例:

[基本示例]
原始数字: 987654321
编码结果: 14q60m9
解码结果: 987654321

[边界值测试]
最大u64值: 18446744073709551615
编码结果: 3w5e11264sgsf
解码结果: 18446744073709551615

[错误处理]
解码失败: Invalid character '@' at position 5

[大小写测试]
混合大小写输入: 21I3V9
解码结果: 123456789

1 回复

Rust Base36编解码库base36使用指南

base36是一个轻量级的Rust库,用于在数字和Base36字符串之间进行高效转换。Base36编码使用数字0-9和字母a-z(不区分大小写)表示数据,适用于需要紧凑字符串表示的场景。

安装

Cargo.toml中添加依赖:

[dependencies]
base36 = "0.2.0"

基本用法

数字转Base36

use base36::{encode, decode};

fn main() {
    // 编码示例
    let num = 123456789;
    let encoded = encode(num);
    println!("{} 编码为 Base36: {}", num, encoded); // 输出: 123456789 编码为 Base36: 21i3v9
}

Base36转数字

use base36::{encode, decode};

fn main() {
    // 解码示例
    let encoded_str = "21i3v9";
    let decoded = decode(encoded_str).unwrap();
    println!("{} 解码为数字: {}", encoded_str, decoded); // 输出: 21i3v9 解码为数字: 123456789
}

高级用法

处理大数字

use base36::{encode_u128, decode_to_u128};

fn main() {
    // 大数字编码
    let big_num = 98765432109876543210u128;
    let encoded = encode_u128(big_num);
    println!("{} 编码为 Base36: {}", big_num, encoded);
    
    // 大数字解码
    let decoded = decode_to_u128(&encoded).unwrap();
    println!("{} 解码为数字: {}", encoded, decoded);
}

自定义字母表

如果需要自定义编码字符集(虽然不常见),可以这样实现:

use base36::{encode_custom, decode_custom};

fn main() {
    // 自定义字母表 (必须包含36个唯一字符)
    let custom_alphabet: Vec<char> = "0123456789abcdefghijklmnopqrstuvwxyz".chars().collect();
    
    let num = 42;
    let encoded = encode_custom(num, &custom_alphabet);
    println!("自定义编码: {}", encoded);
    
    let decoded = decode_custom(&encoded, &custom_alphabet).unwrap();
    println!("自定义解码: {}", decoded);
}

错误处理

解码可能失败(如果包含非法字符):

use base36::decode;

fn main() {
    match decode("invalid$base36") {
        Ok(num) => println!("解码结果: {}", num),
        Err(e) => println!("解码失败: {}", e), // 会输出错误信息
    }
}

完整示例代码

use base36::{encode, decode, encode_u128, decode_to_u128, encode_custom, decode_custom};

fn main() {
    // 基本编码示例
    let num = 123456789;
    let encoded = encode(num);
    println!("基本编码示例:");
    println!("{} 编码为 Base36: {}", num, encoded);
    println!("{} 解码为数字: {}\n", encoded, decode(encoded).unwrap());

    // 大数字处理示例
    let big_num = 98765432109876543210u128;
    let big_encoded = encode_u128(big_num);
    println!("大数字处理示例:");
    println!("{} 编码为 Base36: {}", big_num, big_encoded);
    println!("{} 解码为数字: {}\n", big_encoded, decode_to_u128(&big_encoded).unwrap());

    // 自定义字母表示例
    let custom_alphabet: Vec<char> = "0123456789abcdefghijklmnopqrstuvwxyz".chars().collect();
    let custom_num = 42;
    let custom_encoded = encode_custom(custom_num, &custom_alphabet);
    println!("自定义字母表示例:");
    println!("{} 编码为 Base36: {}", custom_num, custom_encoded);
    println!("{} 解码为数字: {}\n", custom_encoded, decode_custom(&custom_encoded, &custom_alphabet).unwrap());

    // 错误处理示例
    println!("错误处理示例:");
    match decode("invalid$base36") {
        Ok(num) => println!("解码结果: {}", num),
        Err(e) => println!("解码失败: {}", e),
    }
}

性能说明

base36库经过优化,适合高性能场景:

  • 编码/解码操作都是O(n)复杂度
  • 避免不必要的内存分配
  • 使用查表法加速转换

应用场景

  1. 短URL生成
  2. 数据库ID的紧凑表示
  3. 需要人类可读的数字编码
  4. 需要区分数字0和字母O的场合(Base36不使用字母O)

这个库简单易用,是处理Base36编码的理想选择。

回到顶部