Rust十六进制字面量处理库hexlit的使用,高效解析和操作十六进制格式数据
Rust十六进制字面量处理库hexlit的使用,高效解析和操作十六进制格式数据
hexlit是一个零分配、兼容no_std、零成本的库,用于在编译时将十六进制字符串转换为字节数组。
安装
在Cargo.toml中添加:
hexlit = "0.5.5"
示例
use hexlit::hex;
fn main() {
const DATA: [u8; 4] = hex!("01020304");
assert_eq!(DATA, [1, 2, 3, 4]);
assert_eq!(hex!("0xDEADBEEF"), [0xDE, 0xAD, 0xBE, 0xEF]);
assert_eq!(hex!("a1b2c3d4"), [0xA1, 0xB2, 0xC3, 0xD4]);
assert_eq!(hex!("E5 E6 90 92"), [0xE5, 0xE6, 0x90, 0x92]);
assert_eq!(hex!("0a0B0C0d"), [10, 11, 12, 13]);
assert_eq!(hex!(1a 0_b 0C 0d), [0x1a, 11, 12, 13]);
assert_eq!(hex!(0F 03|0B|0C|0d), [15, 3, 11, 12, 13]);
assert_eq!(hex!(0A-0B-0C-0d), [10, 11, 12, 13]);
assert_eq!(
hex!(
A1 B2
C3
D4
),
[0xA1, 0xB2, 0xC3, 0xD4]
);
}
完整示例代码
// 引入hexlit库
use hexlit::hex;
fn main() {
// 基本十六进制字符串转换
const BASIC_HEX: [u8; 4] = hex!("01020304");
println!("基本十六进制: {:?}", BASIC_HEX); // 输出: [1, 2, 3, 4]
// 支持0x前缀
const PREFIXED_HEX: [u8; 4] = hex!("0xDEADBEEF");
println!("带0x前缀: {:?}", PREFIXED_HEX); // 输出: [222, 173, 190, 239]
// 支持大小写混合
const MIXED_CASE: [u8; 4] = hex!("a1b2c3d4");
println!("大小写混合: {:?}", MIXED_CASE); // 输出: [161, 178, 195, 212]
// 支持空格分隔
const SPACE_SEPARATED: [u8; 4] = hex!("E5 E6 90 92");
println!("空格分隔: {:?}", SPACE_SEPARATED); // 输出: [229, 230, 144, 146]
// 支持不同分隔符形式
const VARIOUS_SEPARATORS: [u8; 5] = hex!(0F 03|0B|0C|0d);
println!("不同分隔符: {:?}", VARIOUS_SEPARATORS); // 输出: [15, 3, 11, 12, 13]
// 多行格式
const MULTILINE: [u8; 4] = hex!(
A1 B2
C3
D4
);
println!("多行格式: {:?}", MULTILINE); // 输出: [161, 178, 195, 212]
}
这个库特别适合需要在编译时处理十六进制数据的场景,如协议解析、加密算法实现等。它支持多种格式的十六进制输入,包括带0x前缀、大小写混合、空格分隔以及多行格式等。
1 回复
Rust十六进制字面量处理库hexlit的使用
介绍
hexlit是一个专门用于处理十六进制字面量的Rust库,它提供了高效解析和操作十六进制格式数据的功能。这个库特别适合需要处理二进制数据、网络协议、加密算法等场景,可以方便地将十六进制字符串转换为字节数组,或者将字节数组格式化为十六进制字符串。
主要特性
- 编译时十六进制字面量解析
- 运行时十六进制字符串处理
- 零成本抽象,高性能
- 支持各种输出格式(带前缀、大写、小写等)
安装
在Cargo.toml中添加依赖:
[dependencies]
hexlit = "0.4"
完整示例代码
// 引入hexlit库的各种功能
use hexlit::{hex, hex_decode, hex_encode, hex_encode_upper, hex_encode_with_prefix, hex_decode_lenient};
fn main() {
// 1. 编译时十六进制解析
const COMPILE_TIME_DATA: [u8; 4] = hex!("01020304");
println!("编译时解析结果: {:?}", COMPILE_TIME_DATA); // 输出: [1, 2, 3, 4]
// 2. 运行时十六进制解析
let runtime_hex_str = "deadbeef";
match hex_decode(runtime_hex_str) {
Ok(bytes) => println!("运行时解析结果: {:?}", bytes), // 输出: [222, 173, 190, 239]
Err(e) => println!("解析失败: {}", e),
}
// 3. 十六进制编码
let encode_data = [0x12, 0x34, 0x56, 0x78];
let encoded_str = hex_encode(&encode_data);
println!("编码结果: {}", encoded_str); // 输出: "12345678"
// 4. 带格式的十六进制输出
let format_data = [0xab, 0xcd, 0xef];
println!("大写输出: {}", hex_encode_upper(&format_data)); // 输出: "ABCDEF"
println!("带前缀输出: {}", hex_encode_with_prefix(&format_data)); // 输出: "0xabcdef"
// 5. 处理不同格式的十六进制输入
let messy_input = "0x12 34 AB cd";
match hex_decode_lenient(messy_input) {
Ok(bytes) => println!("宽松解析结果: {:?}", bytes), // 输出: [18, 52, 171, 205]
Err(e) => println!("解析失败: {}", e),
}
// 错误处理示例
match hex_decode("invalid hex") {
Ok(bytes) => println!("成功解析: {:?}", bytes),
Err(e) => println!("解析失败: {}", e), // 会输出解析失败信息
}
}
性能提示
- 对于编译时已知的十六进制字面量,优先使用
hex!
宏,它会在编译期完成转换 - 对于运行时字符串,
hex_decode
比hex_decode_lenient
更快,但要求输入格式严格 - 需要多次转换时,考虑重用分配的缓冲区
hexlit库是处理十六进制数据的轻量级解决方案,特别适合嵌入式开发、网络协议解析等对性能要求较高的场景。