Rust常量解码库const-decoder的使用,const-decoder提供编译时高效解析与转换常量数据的功能
Rust常量解码库const-decoder的使用,const-decoder提供编译时高效解析与转换常量数据的功能
十六进制/Base64解码的常量函数
用于在Rust中将十六进制和base64编码的字符串转换为字节的常量函数。可在稳定版Rust和无标准库环境中工作。同时支持具有自定义字母表的Base-(2,4,8,16,32,64)编码。
用法
添加到您的Crate.toml
:
[dependencies]
const-decoder = "0.4.0"
使用示例:
use const_decoder::Decoder;
// 一个Ed25519密钥。
const SECRET_KEY: [u8; 64] = Decoder::Hex.decode(
b"9e55d1e1aa1f455b8baad9fdf975503655f8b359d542fa7e4ce84106d625b352\
06fac1f22240cffd637ead6647188429fafda9c9cb7eae43386ac17f61115075",
);
// 或者,您可以使用`decode!`宏:
const PUBLIC_KEY: &[u8] = &const_decoder::decode!(
Decoder::Hex,
b"06fac1f22240cffd637ead6647188429fafda9c9cb7eae43386ac17f61115075",
);
Bech32编码:
use const_decoder::{Decoder, Encoding};
const BECH32: Decoder = Decoder::custom("qpzry9x8gf2tvdw0s3jn54khce6mua7l");
// 来自Bech32规范的示例地址,不包括`tb1q`前缀和校验和后缀。
const SAMPLE_ADDR: [u8; 32] =
BECH32.decode(b"rp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q");
更多示例请参见crate文档。
替代方案
hex-literal
和binary_macros
crate作为过程宏提供了类似的功能。由于这个原因,宏不能在无标准库环境中使用,而这种方法可以。
许可证
根据Apache License, Version 2.0或MIT license中的任一许可,由您选择。
除非您明确声明,否则根据Apache-2.0许可定义,您为包含在const-decoder
中而有意提交的任何贡献均应如上所述双重许可,没有任何附加条款或条件。
完整示例代码
// 引入const_decoder库
use const_decoder::Decoder;
// 示例1:使用Decoder::Hex解码十六进制字符串
const SECRET_KEY: [u8; 64] = Decoder::Hex.decode(
b"9e55d1e1aa1f455b8baad9fdf975503655f8b359d542fa7e4ce84106d625b352\
06fac1f22240cffd637ead6647188429fafda9c9cb7eae43386ac17f61115075",
);
// 示例2:使用decode!宏解码十六进制字符串
const PUBLIC_KEY: &[u8] = &const_decoder::decode!(
Decoder::Hex,
b"06fac1f22240cffd637ead6647188429fafda9c9cb7eae43386ac17f61115075",
);
// 示例3:自定义Bech32编码解码
use const_decoder::{Decoder, Encoding};
const BECH32: Decoder = Decoder::custom("qpzry9x8gf2tvdw0s3jn54khce6mua7l");
const SAMPLE_ADDR: [u8; 32] =
BECH32.decode(b"rp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q");
fn main() {
// 打印解码结果
println!("Secret Key: {:?}", SECRET_KEY);
println!("Public Key: {:?}", PUBLIC_KEY);
println!("Sample Address: {:?}", SAMPLE_ADDR);
}
1 回复
Rust常量解码库const-decoder使用指南
概述
const-decoder是一个专门用于编译时高效解析与转换常量数据的Rust库。它通过过程宏和常量函数(const fn)的结合,实现了在编译期间对常量数据进行解码和转换操作,避免了运行时开销。
主要特性
- 编译时数据解析和转换
- 支持多种数据格式(十六进制、Base64、ASCII等)
- 零运行时开销
- 类型安全的解码操作
安装方法
在Cargo.toml中添加依赖:
[dependencies]
const-decoder = "0.3"
基本用法示例
1. 十六进制解码
use const_decoder::Decoder;
const HEX_DATA: &[u8] = Decoder::Hex.decode(b"48656c6c6f20576f726c64");
const EXPECTED: &[u8] = b"Hello World";
fn main() {
assert_eq!(HEX_DATA, EXPECTED);
}
2. Base64解码
use const_decoder::Decoder;
const BASE64_DATA: &[u8] = Decoder::Base64.decode(b"SGVsbG8gV29ybGQ=");
const EXPECTED: &[u8] = b"Hello World";
fn main() {
assert_eq!(BASE64_DATA, EXPECTED);
}
3. 自定义数组解码
use const_decoder::Decoder;
const ARRAY_DATA: [u8; 5] = Decoder::Hex.decode_array(b"0102030405");
const EXPECTED: [u8; 5] = [1, 2, 3, 4, 5];
fn main() {
assert_eq!(ARRAY_DATA, EXPECTED);
}
4. 字符串转换
use const_decoder::Decoder;
const STR_DATA: &str = Decoder::Hex.decode_str(b"48656c6c6f");
const EXPECTED: &str = "Hello";
fn main() {
assert_eq!(STR_DATA, EXPECTED);
}
高级用法
自定义解码器
use const_decoder::{Decoder, Decode};
// 自定义解码函数
const fn custom_decode(input: &[u8]) -> Vec<u8> {
// 实现自定义解码逻辑
let mut result = Vec::new();
let mut i = 0;
while i < input.len() {
result.push(input[i] ^ 0xFF); // 简单的XOR解码示例
i += 1;
}
result
}
const CUSTOM_DATA: Vec<u8> = custom_decode(b"test_data");
结合过程宏使用
use const_decoder::const_decode;
#[const_decode(hex = "48656c6c6f")]
const GREETING: &str = "decoded";
fn main() {
println!("{}", GREETING); // 输出: Hello
}
完整示例demo
// 演示const-decoder库的完整使用示例
use const_decoder::{Decoder, const_decode};
// 基本解码示例
const HEX_DECODED: &[u8] = Decoder::Hex.decode(b"48656c6c6f20576f726c64"); // "Hello World"的十六进制编码
const BASE64_DECODED: &[u8] = Decoder::Base64.decode(b"SGVsbG8gV29ybGQ="); // "Hello World"的Base64编码
// 数组解码
const ARRAY_DECODED: [u8; 5] = Decoder::Hex.decode_array(b"0102030405"); // 解码为[1, 2, 3, 4, 5]
// 字符串解码
const STR_DECODED: &str = Decoder::Hex.decode_str(b"48656c6c6f"); // 解码为"Hello"
// 使用过程宏进行解码
#[const_decode(hex = "52657374206465636f646572")]
const MACRO_DECODED: &str = "placeholder";
// 自定义解码函数
const fn xor_decode(input: &[u8]) -> Vec<u8> {
let mut result = Vec::with_capacity(input.len());
let mut i = 0;
while i < input.len() {
result.push(input[i] ^ 0x55); // 使用0x55作为XOR密钥
i += 1;
}
result
}
const CUSTOM_DECODED: Vec<u8> = xor_decode(b"test_data");
fn main() {
// 验证十六进制解码
assert_eq!(HEX_DECODED, b"Hello World");
println!("十六进制解码: {:?}", String::from_utf8_lossy(HEX_DECODED));
// 验证Base64解码
assert_eq!(BASE64_DECODED, b"Hello World");
println!("Base64解码: {:?}", String::from_utf8_lossy(BASE64_DECODED));
// 验证数组解码
assert_eq!(ARRAY_DECODED, [1, 2, 3, 4, 5]);
println!("数组解码: {:?}", ARRAY_DECODED);
// 验证字符串解码
assert_eq!(STR_DECODED, "Hello");
println!("字符串解码: {}", STR_DECODED);
// 验证过程宏解码
assert_eq!(MACRO_DECODED, "Rust decoder");
println!("过程宏解码: {}", MACRO_DECODED);
// 验证自定义解码
println!("自定义XOR解码: {:?}", CUSTOM_DECODED);
println!("所有解码操作均在编译时完成,零运行时开销!");
}
注意事项
- 所有解码操作都在编译时完成
- 输入数据必须是常量表达式
- 解码失败会在编译时报错
- 支持no_std环境
性能优势
由于所有解码操作都在编译时完成,生成的二进制文件中只包含解码后的结果,因此:
- 零运行时开销
- 不会增加二进制大小(相比运行时解码)
- 编译时错误检查
这个库特别适合处理嵌入式开发、密码学操作和需要高性能常量数据处理的场景。