#irox #serialization #meta-programming #reflection

no-std irox-structs

结构体类型特性 - 线性序列化大/小端字节

7个版本 (4个重大变更)

0.5.1 2024年4月21日
0.5.0 2024年4月1日
0.4.0 2024年1月13日
0.3.1 2023年11月29日
0.1.0 2023年9月5日

#954 in Rust模式

每月24次下载
6 个crate中使用 (直接使用4个)

MIT/Apache

73KB
1K SLoC

IROX-STRUCTS

结构体类型特性 - 线性序列化大/小端字节

一个非常简单的“结构体”库,它提供了一个特异。这个库旨在与irox_structs_derive一起使用,以生成实现。

结构体是在内存中序列化字节线性序列 - 在结构体中按字段顺序序列化,没有相邻或打包。

严格大小

默认情况下,irox_structs_derive将允许可变大小的类型,如StringVec<u8>。如果您知道您不需要/使用这些,请应用一个#[strict_sizing]属性,生成器将向结构体添加一个pub const STRUCT_SIZE: usize

选择端序

在派生Struct时应用#[big_endian]#[little_endian]属性,它将使用适当的序列化器。如果未指定,则默认为大端。

示例大端

use irox_structs::Struct;
use irox_tools::bits::Error;

#[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Struct)]
#[strict_sizing]
pub struct UdpHeader {
    source_port: u16,
    dest_port: u16,
    length: u16,
    checksum: u16,
}

pub fn main() -> Result<(), Error> {
    assert_eq!(8, UdpHeader::STRUCT_SIZE);

    let header = UdpHeader {
        source_port: 0x0064,
        dest_port: 0x0400,
        length: 0x1388,
        checksum: 0x01C2,
    };
    let mut output_buf: Vec<u8> = Vec::new();

    header.write_to(&mut output_buf)?;
    assert_eq!(output_buf.len(), 8);
    assert_eq!(&[0x00u8, 0x64, 0x04, 0x00, 0x13, 0x88, 0x01, 0xC2],
               output_buf.as_slice());

    let parsed = UdpHeader::parse_from(&mut output_buf.as_slice())?;
    assert_eq!(header, parsed);
    Ok(())
}

示例小端

use irox_structs::Struct;
use irox_tools::bits::Error;

#[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Struct)]
#[little_endian]
#[strict_sizing]
pub struct UdpHeader {
    source_port: u16,
    dest_port: u16,
    length: u16,
    checksum: u16,
}

pub fn main() -> Result<(), Error> {
    assert_eq!(8, UdpHeader::STRUCT_SIZE);
    let header = UdpHeader {
        source_port: 0x0064,
        dest_port: 0x0400,
        length: 0x1388,
        checksum: 0x01C2,
    };
    let mut output_buf: Vec<u8> = Vec::new();
    
    header.write_to(&mut output_buf)?;
    assert_eq!(output_buf.len(), 8);
    assert_eq!(&[0x64u8, 0x00, 0x00, 0x04, 0x88, 0x13, 0xC2, 0x01],
               output_buf.as_slice());

    let parsed = UdpHeader::parse_from(&mut output_buf.as_slice())?;
    assert_eq!(header, parsed);
    Ok(())
}

无-STD支持

  • 完全无-STD兼容

特性

模块

模块 [no_std]?
irox_structs no_std 包含“结构体”类型

依赖项

~0.6–1MB
~23K SLoC