#osstring #osstr #cstring #cstr #byte-slice

无std embedded-ffi

适用于嵌入式使用的OsStr和OsString

3个版本

0.1.2 2019年6月1日
0.1.1 2019年5月25日
0.1.0 2019年5月25日

300FFI

Download history • Rust 包仓库 10/week @ 2023-11-27 • Rust 包仓库 1/week @ 2023-12-04 • Rust 包仓库 8/week @ 2023-12-11 • Rust 包仓库 8/week @ 2023-12-18 • Rust 包仓库 7/week @ 2023-12-25 • Rust 包仓库 13/week @ 2024-01-08 • Rust 包仓库 2/week @ 2024-01-15 • Rust 包仓库 6/week @ 2024-02-05 • Rust 包仓库 15/week @ 2024-02-12 • Rust 包仓库 38/week @ 2024-02-19 • Rust 包仓库 60/week @ 2024-02-26 • Rust 包仓库 22/week @ 2024-03-04 • Rust 包仓库 25/week @ 2024-03-11 • Rust 包仓库

149 每月下载量
5 个Crate中使用(通过 ndless

MIT/Apache

47KB
1K SLoC

与FFI绑定相关的实用工具,用于使用Unix类似约定的嵌入式平台。这主要是从Rust标准库中复制粘贴的。

请注意,OsString和CString需要在您的Cargo.toml中启用alloc功能。

此模块提供了处理跨非Rust接口(如其他编程语言和底层操作系统)的数据的实用工具。它主要用于FFI(Foreign Function Interface)绑定和需要与其他语言交换类似C的字符串的代码。

概述

Rust使用String类型表示所有权的字符串,使用 [str] 原始类型表示字符串的借用切片。两者始终使用UTF-8编码,并且可能在中间包含空字节,即如果查看组成字符串的字节,其中可能包含一个 \0Stringstr 都显式存储其长度;与C中的字符串一样,字符串末尾没有空终止符。

C字符串与Rust字符串不同

  • 编码 - Rust字符串是UTF-8,但C字符串可能使用其他编码。如果您正在使用来自C的字符串,您应明确检查其编码,而不仅仅是像在Rust中那样假设它是UTF-8。

  • 字符大小 - C字符串可以使用大小为 charwchar_t 的字符;请注意,C中的 char 与Rust中的不同。C标准将那些类型的实际大小留给了解释,但为每种字符类型组成的字符串定义了不同的API。Rust字符串始终是UTF-8,因此不同的Unicode字符将使用可变数量的字节进行编码。Rust类型 char 表示一个 'Unicode标量值',它与 'Unicode码点' 相似,但并不相同。

  • 空终止符和隐式字符串长度 - 通常,C字符串是空终止的,即它们在末尾有一个 \0 字符。字符串缓冲区的长度没有存储,但必须计算;为了计算字符串的长度,C代码必须手动调用像 strlen() 这样的函数来处理基于 char 的字符串,或者对于基于 wchar_t 的字符串使用 wcslen()。这些函数返回字符串中字符的数量(不包括空终止符),因此缓冲区长度实际上是 len+1 个字符。Rust字符串没有空终止符;它们的长度始终存储,不需要计算。在Rust中,访问字符串的长度是一个O(1)操作(因为长度是存储的),而在C中它是一个O(length)操作,因为长度需要通过扫描字符串来计算空终止符。

  • 内部空字符 - 当C字符串有空终止符字符时,这通常意味着它们不能在中间有空字符——空字符将本质上截断字符串。Rust字符串 可以 在中间有空字符,因为空字符在Rust中不需要标记字符串的结尾。

非Rust字符串的表示

CStringCStr 在需要将UTF-8字符串从C ABI语言(如Python)传输到Rust和其他语言时很有用。

  • 从Rust到C: CString 表示一个拥有、对C友好的字符串:它是空终止的,且没有内部空字符。Rust代码可以从普通字符串(假设字符串中间没有空字符)创建一个 CString,然后使用各种方法获取一个可以传递给使用C字符串约定的函数的原始 *mut [u8]。

  • 从C到Rust: CStr 表示一个借用的C字符串;它是用来封装从C函数中获取的原始 *const [u8] 的。一个 CStr 保证是一个以null结尾的字节数组。一旦你有了 CStr,你可以将其转换为有效的UTF-8的Rust [&str][str],或者通过添加替换字符进行有损转换。

OsStringOsStr 在你需要将字符串从操作系统本身传输到其他地方,或者捕获外部命令的输出时非常有用。在 OsStringOsStr 和 Rust字符串之间的转换与 CStringCStr 的转换类似。

  • OsString 表示操作系统偏好的任何表示形式下的所有字符串。在Rust标准库中,各种在操作系统之间传输字符串的API使用 OsString 而不是普通字符串。

  • OsStr 表示一个指向字符串的借用引用,其格式可以传递给操作系统。它可以以与 OsString 相似的方式转换为UTF-8 Rust字符串切片。

转换

在Unix上

在Unix上,OsStr 实现了 OsStrExt trait,该trait为其添加了两个方法,from_bytesas_bytes。这些方法进行从UTF-8字节切片到和从UTF-8字节切片的低价转换。

此外,在Unix上 OsString 实现了 OsStringExt trait,该trait提供了 from_vecinto_vec 方法,这些方法消耗其参数,并接受或产生 [u8] 向量。

依赖

~235–380KB