Rust中如何无额外长度存储&str到固定字节数组并转回?
Rust中固定32字节数组存储/还原文件名的惯用实现
零终止方案(无需额外存储长度)
和C/C++的思路一致,利用文件名不含\0字节的特性,用\0作为终止标记,这是Rust里最直接的惯用方式:
存储实现
let name = "example_filename.txt"; let mut arr = [0u8; 32]; // 先确保文件名长度+终止符不超过32字节(根据业务场景处理溢出情况) assert!(name.len() + 1 <= 32, "文件名过长,无法存入32字节数组"); // 获取带\0终止符的字节切片,复制到数组中 let bytes_with_null = name.as_bytes_with_nul(); arr[..bytes_with_null.len()].copy_from_slice(bytes_with_null);
还原实现
// 找到第一个\0的位置,若未找到则说明文件名占满整个32字节数组 let end_idx = arr.iter().position(|&byte| byte == 0).unwrap_or(32); // 截取有效字节并转换为String let name_bytes = &arr[..end_idx]; let restored_name = String::from_utf8(name_bytes.to_vec()) .expect("存储的字节不是合法UTF-8字符串");
方案说明
- 零终止是跨语言兼容的轻量方案,无需额外占用空间存储长度
- Rust标准库的
as_bytes_with_nul()可以安全生成带终止符的字节切片,避免手动拼接的错误 - 由于操作系统文件名本身不允许包含
\0,因此不会出现误截断的问题 - 若业务场景中文件名可能刚好达到32字节(无多余空间存放
\0),则需改用显式存储长度的方案:比如用数组的第一个字节存储长度(支持最大31字节的文件名),或通过位操作复用部分字节存储长度信息,但这种场景相对少见。
内容的提问来源于stack exchange,提问作者chenzhongpu
相关产品推荐
相关产品推荐

