3个不稳定版本
0.2.2 | 2022年9月19日 |
---|---|
0.2.1 | 2021年12月28日 |
0.2.0 |
|
0.1.0 | 2020年9月16日 |
#17 in #byte-length
26KB
453 行
SizedBytes
SizedBytes 是一个特质,它体现了将字节数组转换为类型级长度数组的转换。它利用了 generic-array 和 typenum 仓库,这些仓库提供了这种类型级数组长度的 依赖类型模拟。
/// 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 中的许多应用程序都大量进行字节切片之间的转换,手动或使用如 bincode 或 bytes 等方法进行性能优化。然而,这些表示形式的组合一直是繁琐的,并且导致了可能导致错误和麻烦的长度检查。
这允许您定义带有类型长度的字节切片的转换,并组合此类转换,从而提供了一种更安全、更自动化的方式来处理字节表示。
文档
API 可以在这里找到:这里。
安装
将以下行添加到您的 Cargo.toml
依赖中
generic_bytes = "0.2.1"
generic_bytes_derive = "0.2.1"
贡献者
本代码的作者是 François Garillot (@huitseeker)。要了解更多关于为该项目做出贡献的信息,请参阅此文档。
许可证
本项目采用MIT 许可证。
依赖项
~1.5MB
~34K SLoC