有没有办法使用动态大小来copy_from_slice?

问题描述

我正在尝试使用from_le_bytes将Vec的未知部分更改为32位整数。我知道大小将在1到4个字节之间,但这就是我所知道的。这是我的尝试:

use std::u32;

fn main () {
    let my_vec : Vec<u8> = vec![5,1,2,3];
    let user_input = 1;
    let mut my_bytes : [u8;1] = Default::default();
    let val : u32 = match user_input {
        1 => {
            my_bytes.copy_from_slice(&my_vec[0..=0]);
            my_bytes[0]
        },2 => { 
            my_bytes.copy_from_slice(&my_vec[0..2]);
            u16::from_le_bytes(my_bytes)
        },4 => { 
            my_bytes.copy_from_slice(&my_vec[0..4]);
            u32::from_le_bytes(my_bytes);
        },_ => 0,};
    println!("{}",val);
}

这里的问题是my_bytes是静态的,我不知道我可以在其位置使用的另一种类型,它可能允许动态尺寸。应该如何纠正?

解决方法

基于Rodrigo的评论:

实际上,您不需要临时文件:只需写 u16 :: from_le_bytes(my_vec [0..2] .try_into()。unwrap())

以下作品:

use std::convert::TryInto;

fn main () {
    let my_vec : Vec<u8> = vec![5,1,2,1];
    let user_input = 4;
    let val : u32 = match user_input {
        1 => {
            my_vec[0].try_into().unwrap()
        },2 => { 
            u16::from_le_bytes(my_vec[0..2].try_into().unwrap()).try_into().unwrap()
        },4 => { 
            u32::from_le_bytes(my_vec[0..4].try_into().unwrap()).try_into().unwrap()
        },_ => 0,};
    println!("{}",val);
}