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

时间:2015-02-14 12:47:31

标签: rust ffi

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

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

1 个答案:

答案 0 :(得分: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的更多信息,我强烈推荐优秀的文档。