#hex #io #literals #parser #hex-string #proc-macro #byte-array

hex-magic

用于处理字节和十六进制值的宏

2个版本

0.0.2 2021年4月2日
0.0.1 2021年4月1日

#314解析工具

MIT/Apache

31KB
576

这个crate提供用于处理字节和十六进制值的宏。

hex!

hex!是一个宏,它将在编译时将字符串字面量("7D2B")转换为字节数组([0x7D, 0x2B])或匹配模式。

assert_eq!(hex!("01020304"), [1, 2, 3, 4]);

parse_struct!

parse_struct!是一个宏,用于从Read读取器解析字节到结构体(或枚举),具有跳过填充字节的能力。它返回一个Result<Struct, std::io::Error>值。

use hex_magic::parse_struct;
use std::io::{Read, Result};

#[derive(Debug)]
struct Data {
    a: [u8; 2],
    b: u32,
}

fn main() -> Result<()> {
    let bytes = [
        0x48, 0x45, 0x58, 0x00, 0x01, 0x02, 0x00, 0xAA, 0xBB, 0xCC, 0xDD,
    ];
    let data = parse_struct!(bytes.as_ref() => Data {
        _: b"HEX",
        _: [0],
        a: [0x01, _],
        _: "00",
        b: buf @ "AABB ____" => u32::from_le_bytes(*buf),
    })?;
    println!("{:X?}", data); // Data { a: [1, 2], b: DDCCBBAA }
    Ok(())
}

lib.rs:

这个crate提供用于处理字节和十六进制值的宏。

hex!

hex!是一个宏,它将在编译时将字符串字面量("7D2B")转换为字节数组([0x7D, 0x2B])或匹配模式。

assert_eq!(hex!("01020304"), [1, 2, 3, 4]);

parse_struct!

parse_struct!是一个宏,用于从Read读取器解析字节到结构体(或枚举),具有跳过填充字节的能力。它返回一个Result<Struct, std::io::Error>值。

use hex_magic::parse_struct;
use std::io::{Read, Result};

#[derive(Debug)]
struct Data {
    a: [u8; 2],
    b: u32,
}

fn main() -> Result<()> {
    let bytes = [
        0x48, 0x45, 0x58, 0x00, 0x01, 0x02, 0x00, 0xAA, 0xBB, 0xCC, 0xDD,
    ];
    let data = parse_struct!(bytes.as_ref() => Data {
        _: b"HEX",
        _: [0],
        a: [0x01, _],
        _: "00",
        b: buf @ "AABB ____" => u32::from_le_bytes(*buf),
    })?;
    println!("{:X?}", data); // Data { a: [1, 2], b: DDCCBBAA }
    Ok(())
}

依赖

~1.5MB
~35K SLoC