#byte-array #byte-size #byte #byte-length #generic #macro #byte-slice

generic-bytes

一个可派生特性,用于在具有类型级别大小的字节数组之间进行转换

3 个不稳定版本

0.2.2 2022 年 9 月 19 日
0.2.1 2021 年 12 月 28 日
0.2.0 2021 年 12 月 28 日
0.1.0 2020 年 9 月 16 日

1512Rust 模式 中排名

每月下载 47
2 个包中使用(通过 generic-bytes-derive

MIT 许可证

7KB

SizedBytes 构建状态

SizedBytes 是一个特性,它体现了将字节数组转换为和从其转换的类型级别长度的数组。它利用了 generic-arraytypenum 包,它们提供了类型级别数组长度的这种 模拟

/// A trait for sized key material that can be represented within a fixed byte
/// array size, used to represent our DH key types. This trait being
/// implemented with Error = SomeError allows you to derive
/// `TryFrom<&[u8], Error = SomeError>`.
pub trait SizedBytes: Sized {
    /// The typed representation of the byte length
    type Len: ArrayLength<u8> + 'static;


    /// Converts this sized key material to a `GenericArray` of the same
    /// size. One can convert this to a `&[u8]` with `GenericArray::as_slice()`
    /// but the size information is then lost from the type.
    fn to_arr(&self) -> GenericArray<u8, Self::Len>;


    /// How to parse such sized material from a correctly-sized byte slice.
    fn from_arr(arr: &GenericArray<u8, Self::Len>) -> Result<Self, TryFromSizedBytesError>;
}

generic-bytes-derive 包提供了一个派生宏,允许您为任何满足 SizedBytes 约束的

  • 元组派生一个 SizedBytes 实现,
  • 结构体中的所有字段都满足 SizeBytes 约束。

字段或组件按照它们在原始结构体或元组中出现的顺序进行序列化(或从其字节表示形式反序列化)。

例如

#[derive(SizedBytes)]
struct Foo <T: SizedBytes>{
    f1: T,
    f2: GenericArray<u8, U32>,
}
// you can now call `to_arr` and `from_arr` on any Foo

还提供了一个针对 GenericArray<u8, N> 的泛型 SizedBytes 实现。

目的

Rust 中的许多应用程序都进行大量的字节切片之间的转换,手动或使用如 bincodebytes 之类的性能方法。然而,这些表示形式的组合始终是繁琐的,并且导致了可能导致错误和繁琐的长度检查。

这允许您定义一个将长度包含在类型中的字节切片转换,并组合这样的转换,从而提供了一种更安全、更自动化的方式来处理字节表示。

文档

API 可以在这里找到:这里

安装

将以下行添加到您的 Cargo.toml 的依赖项中

generic_bytes = "0.2.1"
generic_bytes_derive = "0.2.1"

贡献者

本代码的作者是François Garillot(@huitseeker)。要了解更多关于如何为此项目做出贡献的信息,请参阅此文档

许可证

本项目采用MIT许可证

依赖

~245KB