如何向数组引用写入字节范围?手动序列化数据至数组
手动序列化整数到固定大小数组的解决方案
问题背景
手动将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
相关产品推荐
相关产品推荐

