#byte-array #raw #sized #value #structure #u8 #view

无标准库 rawbytes

将任何大小的值视为 &[u8]

5个版本 (2个稳定版)

1.0.1 2024年3月17日
1.0.0 2023年8月31日
0.1.2 2021年7月1日
0.1.1 2020年4月6日
0.1.0 2020年4月6日

#55无标准库

Download history 60/week @ 2024-04-01 15/week @ 2024-04-08 26/week @ 2024-04-15 28/week @ 2024-04-22 28/week @ 2024-04-29 14/week @ 2024-05-06 21/week @ 2024-05-13 21/week @ 2024-05-20 24/week @ 2024-05-27 20/week @ 2024-06-03 18/week @ 2024-06-10 16/week @ 2024-06-17 15/week @ 2024-06-24 27/week @ 2024-07-08 15/week @ 2024-07-15

每月60次下载
5 个包中使用 (通过 xoodoo)

MIT 协议

4KB

rawbytes

一个Rust包,可以将结构体视为普通的字节数组 (&[u8])。

非常简单。小巧。无依赖。

这是一个更安全的 slice::from_raw_parts_{mut}() 接口。

示例用法

use rawbytes::RawBytes;

#[repr(C, packed(4))]
struct Foo {
    x: [u32; 32],
}

#[test]
fn test() {
    let mut foo = Foo { x: [0; 32] };

    let foo_bytes = RawBytes::bytes_view(&foo);
    assert_eq!(foo_bytes.len(), 128);

    let foo_bytes = RawBytes::bytes_view_mut(&mut foo);
    foo_bytes[0] = 1;
    assert_eq!(foo.x[0], 1);
}

注意,结构体必须具有 C 表示形式,以确保新的Rust版本不会更改表示形式。

警告和替代方案

警告:此包包含两个实例的 unsafe 关键字,因为在Rust中没有其他方法实现此功能。尽管如此,您可能因为使用包含该关键字的包而受到指责。

一个替代方案是 zerocopy 包。它更大、更复杂、速度没有更快,并且也要求使用 unsafe 关键字。但是,它由一位Google员工维护,因此您可能不会受到太多的指责。

无运行时依赖