#macro-derive #message-format #binary-representation #proc-macro #serialization #deserialize #networking

macro message_macro_derive

一个用于生成/解析消息二进制表示的宏

3个版本

0.1.2 2023年7月1日
0.1.1 2023年7月1日
0.1.0 2023年7月1日

859过程宏

MIT 许可证

45KB
633

消息宏推导

消息宏推导是一个过程宏crate,它提供了一个自定义推导宏,用于为Rust中的网络结构体生成序列化和反序列化方法。该宏生成代码以将结构体转换为字节表示形式(序列化),反之亦然(反序列化),使用大端序。它的目的是通过自动化Rust结构和字节数组之间的转换来简化与网络协议和消息格式的交互过程。

注意:消息宏推导目前处于开发阶段,尚未在生产环境中彻底测试。请谨慎使用,并在您的特定用例中确保进行适当的测试和验证。

使用方法

要使用消息宏推导,将其添加到您的 Cargo.toml 文件中的依赖项

[dependencies]
message_macro_derive = "0.1"

然后,从消息宏推导crate导入BeBytes特质,并为其结构体推导它

use message_macro_derive::BeBytes;

#[derive(BeBytes)]
struct MyStruct {
    // Define your struct fields here...
}

BeBytes推导宏将为您的结构体生成以下方法

  • try_from_be_bytes(&[u8]) -> Result<(Self, usize), Box<dyn std::error::Error>>: 一个将字节切片转换为您的结构体实例的方法。它返回一个包含反序列化结构和消耗的字节数的结果。
  • to_be_bytes(&self) -> Vec<u8>: 一个将结构体转换为字节表示形式的方法。它返回一个包含序列化字节的 Vec<u8>
  • field_size(&self) -> usize:一个用于计算结构体大小的方法(以字节为单位)。

示例

以下是一个展示Message宏衍生的使用示例。

use message_macro_derive::BeBytes;

#[derive(BeBytes)]
struct MyStruct {
    #[U8(size(1), pos(0))]
    field1: u8,
    #[U8(size(4), pos(1))]
    field2: u8,
    field3: u32,
}

fn main() {
    let my_struct = MyStruct {
        field1: 1,
        field2: 7,
        field3: 42,
    };

    let bytes = my_struct.to_be_bytes();
    println!("Serialized bytes: {:?}", bytes);

    let deserialized = MyStruct::try_from_be_bytes(&bytes).unwrap().0;
    println!("Deserialized struct: {:?}", deserialized);
}

在这个示例中,我们定义了一个具有三个字段的MyStruct结构体。使用#[U8]属性来指定字段的序列化大小和位置。BeBytes衍生物宏为该结构体生成序列化和反序列化方法,使我们能够轻松地将它转换为字节然后再转换回来。

许可证

本项目采用MIT许可证

依赖关系

~285–740KB
~18K SLoC