从 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
的更多信息,我强烈推荐优秀的文档。
我有一个函数接受带有 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
的更多信息,我强烈推荐优秀的文档。