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
}
}
功能说明
encode(num: u64) -> String
- 将无符号64位整数编码为Base36字符串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)复杂度
- 避免不必要的内存分配
- 使用查表法加速转换
应用场景
- 短URL生成
- 数据库ID的紧凑表示
- 需要人类可读的数字编码
- 需要区分数字0和字母O的场合(Base36不使用字母O)
这个库简单易用,是处理Base36编码的理想选择。