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

2024-03-21

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

There's from_byte_slice in OsStrExt,但似乎它没有检查数据是否正确 WTF-8 或其他什么,并且不清楚如何使用它。


您可以使用from_raw_parts http://doc.rust-lang.org/std/slice/fn.from_raw_parts.html从原始指针转到切片,然后OsStrExt::from_bytes http://doc.rust-lang.org/std/os/unix/ffi/trait.OsStrExt.html:

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 https://simonsapin.github.io/wtf-8/,我强烈推荐优秀的文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐