6个版本
0.0.5 | 2022年6月14日 |
---|---|
0.0.4 | 2021年12月1日 |
0.0.3-dev | 2021年11月30日 |
0.0.2-dev | 2021年11月30日 |
0.0.1-dev | 2021年11月30日 |
在 过程宏 中排名第 671
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