从 FFI 返回的切片创建 OsStr(ing) 的正确方法是什么?

What's the right way to create OsStr(ing) from a FFI-returned slice?

我有一个函数接受带有 args data: *const u8, length: usize 的回调,代表一些路径。从中创建 OsStr(ing) 的正确方法是什么?

OsStrExt中有from_byte_slice,但似乎没有检查数据是否正确WTF-8之类的,不清楚如何使用它。

您可以使用 from_raw_parts to go from the raw pointer to a slice, then OsStrExt::from_bytes:

use std::slice;
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt; // NOTE PLATFORM-SPECIFIC

fn foo(data: *const u8, length: usize) {
    let slice = unsafe { slice::from_raw_parts(data, length) };
    let os_str = OsStr::from_bytes(slice);
}

fn main() {
}

请注意,这是 *nix 特定的 - Windows 和 *nix 不代表路径是相同的方式(原来这东西相当复杂!) .如果您的 API 实际上返回的是 UTF-8 字符串,那么您可以使用普通字符串方法将原始组件转换为 &str,然后再转换为 OsStr(ring).

有关 WTF-8 的更多信息,我强烈推荐优秀的文档。