1 个不稳定版本
使用旧的Rust 2015
| 0.1.0 | 2024年8月8日 |
|---|
408 在 过程宏 中
105 每月下载量
24KB
298 行
rbitpack
该 rbitpack crate 提供了一个过程宏,用于将结构体的布尔字段打包和解包到各种位大小。这可以特别有用,用于减少内存使用或执行位级操作。
功能
- 高效的打包和解包:将多个布尔字段打包到一个整数类型中(
u8、u16、u32、u64)或一个Vec<u64>中。 - 溢出处理:控制当布尔字段的数量超过可用的位时是否触发溢出错误。
- 动态位字段大小:支持使用来自
bitvalcrate 的Bitfield类型打包到动态位字段大小。
使用方法
要使用 rbitpack 宏,将其添加到您的结构体中,如下所示
use rbitpack::BitwisePackable;
#[derive(BitwisePackable)]
#[rbitpack(size = "i8", overflow = false)]
struct MyStruct {
field1: bool,
field2: bool,
// Add more fields as needed
}
属性
size:指定打包的位大小(i8、i16、i32、i64,或auto用于动态大小)。overflow:控制是否在溢出时恐慌(默认为false)。
自动大小
如果您使用 auto 作为 size 属性,则需要安装并导入来自 bitval crate 的 Bitfield 类型。将 bitval 添加到您的 Cargo.toml。
[dependencies]
bitval = "0.1"
然后,在您的Rust代码中导入 Bitfield
use bitval::Bitfield;
示例
使用 u8 进行打包和解包
#[derive(BitwisePackable)]
#[rbitpack(size = "i8")]
struct Example {
a: bool,
b: bool,
c: bool,
}
let example = Example { a: true, b: false, c: true };
let packed = Example::pack(&example);
let unpacked = Example::unpack(packed);
使用动态位字段大小
#[derive(BitwisePackable)]
#[rbitpack(size = "auto")]
struct DynamicExample {
x: bool,
y: bool,
z: bool,
}
let example = DynamicExample { x: true, y: false, z: true };
let packed = DynamicExample::pack(&example);
let unpacked = DynamicExample::unpack(packed);
许可证
此软件包采用MIT许可证。有关详细信息,请参阅LICENSE文件。
依赖项
~1.5MB
~36K SLoC