Rust 如何转换&;[u8]进入&;[u8;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[…])。尝试使用()

我正在编写需要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[…])。尝试使用()展开();

如果差值在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(()))
    }
}