如何转换 [i8; 88] 一些粘稠的东西
How to convert [i8; 88] to something stringy
我有一个 bytes: [i8; 88]
(例如 88,但您可能会看到它的来源)。据说这是 utf-8 string
的 bytes
表示。对于额外的扭曲,这个 array
可能是非 null 终止的。将此 object
转换为 native Rust string (String ?)?
的最惯用方法是什么同样的问题,但最便宜的方法,例如没有内存分配或任何其他标准。
我作为一个刚开始学习语言的人的第一次天真的尝试:
fn statfs_get_mntonname(s: &statfs) -> String {
let mut v_mntonname: std::vec::Vec<u8> = Vec::new();
for i in 0..88 {
v_mntonname.push(s.f_mntonname[i] as u8)
}
v_mntonname.push(0);
let c_mnttoname = unsafe { CStr::from_bytes_with_nul_unchecked(
v_mntonname.as_ref()) };
(*c_mnttoname.to_string_lossy()).to_string()
}
我想你在寻找 from_utf8
or its unsafe cousin from_utf8_unchecked
。
感谢@phimuemue,以下解决了我的需求:
fn mnt_to_string(bytes: &[i8]) -> String {
unsafe { std::str::from_utf8_unchecked(std::mem::transmute(bytes)) }.to_string()
}
fn statfs_get_fstypename(s: &statfs) -> String {
mnt_to_string(&s.f_fstypename as &[i8])
}
我有一个 bytes: [i8; 88]
(例如 88,但您可能会看到它的来源)。据说这是 utf-8 string
的 bytes
表示。对于额外的扭曲,这个 array
可能是非 null 终止的。将此 object
转换为 native Rust string (String ?)?
的最惯用方法是什么同样的问题,但最便宜的方法,例如没有内存分配或任何其他标准。
我作为一个刚开始学习语言的人的第一次天真的尝试:
fn statfs_get_mntonname(s: &statfs) -> String {
let mut v_mntonname: std::vec::Vec<u8> = Vec::new();
for i in 0..88 {
v_mntonname.push(s.f_mntonname[i] as u8)
}
v_mntonname.push(0);
let c_mnttoname = unsafe { CStr::from_bytes_with_nul_unchecked(
v_mntonname.as_ref()) };
(*c_mnttoname.to_string_lossy()).to_string()
}
我想你在寻找 from_utf8
or its unsafe cousin from_utf8_unchecked
。
感谢@phimuemue,以下解决了我的需求:
fn mnt_to_string(bytes: &[i8]) -> String {
unsafe { std::str::from_utf8_unchecked(std::mem::transmute(bytes)) }.to_string()
}
fn statfs_get_fstypename(s: &statfs) -> String {
mnt_to_string(&s.f_fstypename as &[i8])
}