arrays - 从不同大小的数组构造结构
问题描述
我想从这样的数组构建一个结构:
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 方式是什么?如何索引在编译时未知的数组大小?
解决方案
需要明确的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);
推荐阅读
- python - 如何从另一个类中的函数调用一个类?
- ruby-on-rails - 如何在葡萄实体的响应中修复 JSON 字符串
- javascript - 如何使用 web api 实现联系我们表单以进行免费测试
- php - 如何将变量值从一个函数发送到不同页面中的另一个函数
- swift - 无法转换“NSAttributedString.DocumentAttributeKey”类型的值,“DocumentReadingOptionKey”也不起作用
- javascript - 使用 gurnt-connect-proxy 代理到 cloudfront 得到 403 错误
- javascript - 警报未定义且“findUser”变量未定义
- c# - Visual Studio 2019 调试后自动删除 nuget 包
- github - Webhook - 无效的 HTTP 响应:404
- java - Windows 无法启动服务,错误 1053:服务未及时响应启动或控制请求