#byte #generic #macro #byte-length #macro-derive #byte-slice

generic-bytes-derive

一个用于从具有类型级大小的字节数组转换的SizedBytes特质的宏

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日

#17 in #byte-length

MIT 许可证

26KB
453

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 仓库提供了一种 derive 宏,允许您为任何满足 SizedBytes 约束的

  • 所有元素为元组的元组实现 SizedBytes 实现方法,
  • 所有字段都满足 SizeBytes 约束的结构体实现 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 许可证

依赖项

~1.5MB
~34K SLoC