Как правильно создать OsStr(ing) из фрагмента, возвращенного FFI?

У меня есть функция, которая принимает обратный вызов с аргументами data: *const u8, length: usize, который представляет некоторый путь. Как правильно создать из этого OsStr(ing)?

В OsStrExt есть from_byte_slice, но, похоже, он не проверяет правильность данных WTF-8 или что-то в этом роде, и непонятно, как его использовать.


person Anonymous    schedule 14.02.2015    source источник


Ответы (1)


Вы можете использовать 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 я настоятельно рекомендую прекрасную документацию.

person Shepmaster    schedule 14.02.2015
comment
Это все еще верно для 1.0? <OsStr as std::os::unix::ffi::OsStrExt>::from_bytes(CStr::from_ptr(c_path).to_bytes()) компилируется, но это ужасно. - person Kornel; 16.06.2015
comment
@porneL Я обновил пример для 1.0, но похоже, что в вашем случае все еще будут острые края :-) - person Shepmaster; 16.06.2015