You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向数组引用写入字节范围?手动序列化数据至数组

手动序列化整数到固定大小数组的解决方案

问题背景

手动将FileAttr字段序列化到固定大小的[u8;64]数组时,尝试直接给切片赋值出现编译错误:

the size for values of type `[u8]` cannot be known at compilation time
the trait `Sized` is not implemented for `[u8]`
the left-hand-side of an assignment must have a statically known size

原因是buf[0..8]这类表达式属于动态大小的切片类型&mut [u8],无法直接接收to_le_bytes()返回的固定大小数组(如[u8;8])。

解决方法

使用切片的copy_from_slice方法,该方法允许将同长度的源切片内容复制到目标可变切片中,编译器会在编译期校验长度一致性,既安全又简洁。

修改后的代码示例:

use fuser::FileAttr;

pub struct Inode {
    attr: FileAttr,
}

impl Inode {
    pub fn to_buf(&self, buf: &mut [u8; 64]) {
        // 序列化ino(u64,占8字节)
        buf[0..8].copy_from_slice(&self.attr.ino.to_le_bytes());
        // 序列化uid(u32,占4字节)
        buf[8..12].copy_from_slice(&self.attr.uid.to_le_bytes());
        // 序列化gid(u32,占4字节)
        buf[12..16].copy_from_slice(&self.attr.gid.to_le_bytes());
        // 后续字段按相同逻辑处理即可
    }
}

原理说明

  • to_le_bytes()返回固定大小的数组(例如u64对应[u8;8]),可直接通过&转换为切片&[u8]。
  • copy_from_slice会在编译期检查源切片与目标切片的长度是否匹配,长度不一致时直接抛出编译错误,避免运行时问题。
  • 该方案完全基于Rust标准库实现,无需额外依赖,契合手动序列化的需求。

内容的提问来源于stack exchange,提问作者fadedbee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:42:15