Rust十六进制字面量处理库hexlit的使用,高效解析和操作十六进制格式数据

Rust十六进制字面量处理库hexlit的使用,高效解析和操作十六进制格式数据

hexlit是一个零分配、兼容no_std、零成本的库,用于在编译时将十六进制字符串转换为字节数组。

Current Crates.io Version docs-rs MSRV 1.51+

安装

在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_decodehex_decode_lenient更快,但要求输入格式严格
  • 需要多次转换时,考虑重用分配的缓冲区

hexlit库是处理十六进制数据的轻量级解决方案,特别适合嵌入式开发、网络协议解析等对性能要求较高的场景。

回到顶部