Rust 如何转换&;[u8]进入&;[u8;64]?
我正在编写需要64字节块的代码,我希望在类型级别强制执行此大小:Rust 如何转换&;[u8]进入&;[u8;64]?,rust,type-conversion,Rust,Type Conversion,我正在编写需要64字节块的代码,我希望在类型级别强制执行此大小: fn f(buf:&[u8;64]){ 但是,数据是以片的形式进入的&[u8]。因此,我希望能够获取此函数的子空间,并将其转换为&[u8;64]。事实证明,以下转换是有效的: 让buf=(0..32).collect::(); 让z:&[u8;32]=&(&buf[…])。尝试使用()展开(); 但以下情况并非如此: 让buf=(0..64).collect::(); 让z:&[u8;64]=&(&buf[…])。尝试使用()
fn f(buf:&[u8;64]){
但是,数据是以片的形式进入的&[u8]
。因此,我希望能够获取此函数的子空间,并将其转换为&[u8;64]
。事实证明,以下转换是有效的:
让buf=(0..32).collect::();
让z:&[u8;32]=&(&buf[…])。尝试使用()展开();
但以下情况并非如此:
让buf=(0..64).collect::();
让z:&[u8;64]=&(&buf[…])。尝试使用()展开();
如果差值在0到32之间(含0到32),则转换有效,但对于大于32的尺寸则无效。如何在不手动执行数据复制的情况下启用此
&[u8]
->&[u8;64]
转换?如果需要,可以将其用于0-32大小
#[stable(feature = "try_from", since = "1.34.0")]
impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N]
where
[T; N]: LengthAtMost32,
{
type Error = TryFromSliceError;
fn try_from(slice: &[T]) -> Result<&[T; N], TryFromSliceError> {
if slice.len() == N {
let ptr = slice.as_ptr() as *const [T; N];
unsafe { Ok(&*ptr) }
} else {
Err(TryFromSliceError(()))
}
}
}
您还可以编写
struct TryFromSliceError
并创建一个带有Err(TryFromSliceError)
的实例,这样就不需要将单元类型作为结构成员了。@hellow-yes。我只是复制了标准库的内容。我认为这是因为不能在模块之外创建实例。
struct TryFromSliceError(());
fn slice_to_array_64<T>(slice: &[T]) -> Result<&[T; 64], TryFromSliceError> {
if slice.len() == 64 {
let ptr = slice.as_ptr() as *const [T; 64];
unsafe {Ok(&*ptr)}
} else {
Err(TryFromSliceError(()))
}
}