1 个不稳定版本
0.1.0 | 2023年11月30日 |
---|
#260 在 无标准库
在 ubus 中使用
20KB
294 行
storage_endian
用于显式定义存储字节序的简单整数包装器。
包装器使用标准Rust特性提供比较、算术和转换。
我在多个项目中多次编写了这个crate的代码,所以我觉得是时候将其做成一个crate了! :)
示例用法
use storage_endian::{BEu32, BEu64};
#[repr(C)]
struct Data {
magic: BEu32,
version: BEu32,
size: BEu64,
thing: BEu64,
}
impl Data {
pub const SIZE: usize = core::mem::size_of::<Self>();
pub const MAGIC: u32 = 0x1337_beef;
fn handle_thing(thing: u64) {
// ...
}
pub fn from_bytes(data: [u8; Self::SIZE]) -> Self {
let mut data: Self = unsafe { core::mem::transmute(data) };
assert_eq!(data.magic, Self::MAGIC);
assert_eq!((data.version >> 16) & 0xff, 0x01);
assert!(data.size >= Self::SIZE as u64);
Self::handle_thing(data.thing.into());
data
}
}
如您所见,大多数时候您无需担心底层数据的字节序,运算符重载会为您处理。
为了避免错误,故意没有提供访问底层表示形式数据的简单方法。
替代方案
在Rust中管理字节序翻转有多种其他解决方案,您可能感兴趣的是使用以下内容
- https://crates.io/crates/bswap
- https://crates.io/crates/byteorder
- https://crates.io/crates/endian
- https://crates.io/crates/simple_endian
由于各种原因,这些方案可能不完全适用于我的某些用例,但它们可能适用于其他人!