#byte #proc-macro

byteme

将结构体转换为Vec并反向转换。默认情况下,转换是大端。

6个版本

0.0.5 2022年6月14日
0.0.4 2021年12月1日
0.0.3-dev2021年11月30日
0.0.2-dev2021年11月30日
0.0.1-dev2021年11月30日

过程宏 中排名第 671

Apache-2.0

16KB
250

byteme

一个通过在结构体上实现From trait将结构体转换为Vec并反向转换的过程宏。默认情况下,转换是大端。

我们对结构体有以下假设

  • 结构体必须有字段。
  • 字段是公开的。
  • 字段具有以下类型
    • u8
    • u16
    • u32
    • u64
    • u128
    • usize
    • [u8;N]
    • 枚举
  • 对于枚举,我们必须附加一个#[byte_me)$size]属性,其中size是正整数类型之一。
  • 枚举声明必须具有来自num-derive crate的#[derive)]FromPrimitive trait。

num-derive crate是生成枚举的FromPrimitive trait所必需的。话虽如此,可以使用num-enum crate实现相同的功能。它提供了对枚举数据类型的进一步控制,可能很有用。这里是关于这个话题的讨论

示例

use byteme::ByteMe;
pub use num_derive::FromPrimitive;


#[derive(Debug, FromPrimitive)]
pub enum Mode {
  Unavailable = 0,
  Unauthenticated = 1,
  Authenticated = 2,
  Encrypted = 4,
}

#[derive(ByteMe, Debug)]
pub struct FrameOne {
  pub unused: [u8; 12],
  #[byte_me(u32)]
  pub mode: Mode,
  pub challenge: [u8; 16],
  pub salt: [u8; 16],
  pub count: u32,
  pub mbz: [u8; 12],
};

let frame = FrameOne {
  unused: [0; 12],
  mode: Mode::Authenticated,
  challenge: [0; 16],
  salt: [0; 16],
  count: 1024,
  mbz: [0; 12],
};

let size = FrameOne::SIZE; // Get the number of bytes in the frame
let bytes: Vec<u8> = frame.into(); // Converts the frame into vector of bytes
let frame: FrameOne = bytes.into(); // Converts the bytes back to frame

许可证:Apache-2.0

依赖项

~1.5MB
~37K SLoC