1 个不稳定版本
0.1.0 | 2021年4月22日 |
---|
#1300 在 进程宏 中
18KB
319 行
transmute-tools
提供进程宏以辅助安全地创建可转换的数据结构。明确指出,这并不使使用transmute变得安全。这只是一个可能帮助您实现此目的的工具集合。具体的初始用例是帮助忠实复制来自 NVMe规范 的结构。
用法
位置断言
transmute_tools::test_structure
提供了一个属性,允许指定结构体中字段必须放置的位置
use structural_assert::test_structure;
#[test_structure(size = 20)]
#[repr(C, packed)]
pub struct Foo {
#[loc(0:0)]
pub a: u8,
#[loc(1:1)]
pub b: u8,
#[loc(2:3)]
pub c: u16,
#[loc(4:19)]
pub d: u128,
}
字节序
transmute_tools::endianness
提供了一个属性,允许指定结构体字段的具体字节序。类似于这样的结构体
#[macro_use]
extern crate transmute_tools;
#[endianness(be)]
#[repr(C, packed)]
pub struct Foo {
pub a: u8,
pub b: u8,
pub c: u16,
#[le]
pub d: u128,
pub e: Box<()>,
}
将生成以下内容
#[repr(C, packed)]
pub struct Convert {
// Note the missing visbilities.
a: u8,
b: u8,
c: u16,
d: u128,
pub e: Box<()>,
}
impl Convert {
#[inline]
pub fn a(&self) -> u8 {
u8::from_be(self.a)
}
#[inline]
pub fn set_a(&mut self, value: u8) {
self.a = value.to_be();
}
#[inline]
pub fn b(&self) -> u8 {
u8::from_be(self.b)
}
#[inline]
pub fn set_b(&mut self, value: u8) {
self.b = value.to_be();
}
#[inline]
pub fn c(&self) -> u16 {
u16::from_be(self.c)
}
#[inline]
pub fn set_c(&mut self, value: u16) {
self.c = value.to_be();
}
#[inline]
pub fn d(&self) -> u128 {
u128::from_le(self.d)
}
#[inline]
pub fn set_d(&mut self, value: u128) {
self.d = value.to_le();
}
}
注意:这必须生成函数而不是使用类似 simple_endianness 的东西,因为访问打包结构体的字段是通过值而不是引用进行的。
依赖关系
~1.5MB
~35K SLoC