首页 > 解决方案 > 从不同大小的数组构造结构

问题描述

我想从这样的数组构建一个结构:

use std::convert::TryFrom;

impl TryFrom for Chunk {
    type Error = Error;
    
    fn try_from<&[u8]>(bytes: &[u8]) -> Result<Self> {
        // construct
    }
}

数组需要被分割成一些片段,然后将这些片段转换为所需的数据类型并用于初始化结构。

但是我遇到了这个问题:数组的可变成员的大小作为 struct 的前四个字节给出bytes[0..4]。但是当我尝试访问这四个字节时,我得到错误,即在编译时数组的大小是未知的,因此 Rust 不允许我对其进行索引。

做我想要完成的事情的正确的 Rustacean 方式是什么?如何索引在编译时未知的数组大小?

标签: arraysrust

解决方案


需要明确的bytes是,不是数组,而是切片。这些在 Rust 中是不同的:数组的大小在编译时是固定的,而切片则没有。

分割切片的方法有很多。如果块的大小相同,那么chunks就是要走的路。它在这些固定大小的块上返回一个迭代器,作为子切片。

如果它们没有固定大小,另一种选择是调用split_at,它将从源构造两个新切片,在提供的索引处划分。您需要确保拆分索引有效,否则方法会出现混乱。

因此,要将前四个字节从切片中拆分出来,您可以执行以下操作:

// Split into two chunks, of size 4 and (bytes.len() - 4)
let (head, remainder) = bytes.split_at(4);

// convert `head` to whatever type you need

// Continue, for example parsing out a 2-byte type.
let (head, remainder) = remainder.split_at(2); 

推荐阅读