如何正确地从FFI返回的切片创建OsStr(ing)?

5

我有一个功能,接受一个带参数的回调函数data: *const u8, length: usize,表示一些路径。如何正确地从中创建OsStr(ing)呢?

OsStrExt中有from_byte_slice,但似乎它不检查数据是否是正确的WTF-8或其他格式,并且不清楚如何使用它。

1个回答

3

您可以使用from_raw_parts将原始指针转换为切片,然后使用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的更多信息,我强烈推荐阅读优秀的文档。

这在1.0版本中仍然适用吗?<OsStr as std::os::unix::ffi::OsStrExt>::from_bytes(CStr::from_ptr(c_path).to_bytes())可以编译,但是它很丑陋。 - Kornel
1
@porneL,我已经更新了1.0的示例,但似乎你的情况仍然存在一些棱角分明的问题 :-) - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接