gpt4 book ai didi

rust - 如何从原始 C 字符串(CStr 或 *const u8)获取路径?

转载 作者:行者123 更新时间:2023-11-29 08:06:12 42 4
gpt4 key购买 nike

使用 C 字符串作为 Rust 的 Path 最直接的方法是什么?

我从 FFI 获得了 const char * 并且需要将其用作 Rust 中的文件系统路径。

  • 我不想在路径上强制使用 UTF-8,因此不希望通过 str/String 进行转换。
  • 至少对于 ASCII 路径,它应该可以在 Windows 上运行。

澄清一下:我只是用 Rust stdlib 实现替换了将路径传递给 fopen 的现有 C 实现。对于给定的文件系统,它是否是有效路径或正确编码都不是我的问题,只要它不比 fopen 差(而且我知道 fopen 基本上不起作用Windows)。

最佳答案

这是我学到的东西:

  • Path/OsStr 在 Windows 上总是使用 WTF-8,在 Unix 上是一个无编码的字节包。

  • 它们从不使用任何“宽”编码(如 UTF-16 或 UCS-2)存储任何路径。 OsStr 的仅限 Windows 的伪装是隐藏 WTF-8 编码,仅此而已。

  • 它极不可能改变,因为标准库 API 支持从 UTF-8 &str 创建 PathOsStr > 没有任何内存分配或突变(即支持 as_ref(),并且其严格的 API 不留空间将其实现为指针转换以外的任何方式)。

    <

Unix-only 零拷贝版本(它甚至不依赖于任何实现细节):

use std::ffi::{CStr,OsStr};
use std::path::Path;
use std::os::unix::ffi::OsStrExt;

let slice = CStr::from_ptr(c_null_terminated_string_ptr_here);
let osstr = OsStr::from_bytes(slice.to_bytes());
let path: &Path = osstr.as_ref();

在 Windows 上,仅转换有效的 UTF-8 是 Rust 可以做的最好的事情,而无需从代码单元创建 WTF-8 OsString:


let str = ::std::str::from_utf8(slice.to_bytes()).expect("keep your surrogates paired");
let path: &Path = str.as_ref();

关于rust - 如何从原始 C 字符串(CStr 或 *const u8)获取路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46342644/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com