#endian #wrapper #integer #arithmetic #comparison #explicitly #conversion

no-std storage_endian

用于显式定义存储字节序的简单整数包装器

1 个不稳定版本

0.1.0 2023年11月30日

#260无标准库


ubus 中使用

BSD-2-Clause

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中管理字节序翻转有多种其他解决方案,您可能感兴趣的是使用以下内容

由于各种原因,这些方案可能不完全适用于我的某些用例,但它们可能适用于其他人!

无运行时依赖