3个版本
| 0.1.2 | 2019年6月1日 |
|---|---|
| 0.1.1 | 2019年5月25日 |
| 0.1.0 | 2019年5月25日 |
300 在 FFI 中
149 每月下载量
在 5 个Crate中使用(通过 ndless)
47KB
1K SLoC
与FFI绑定相关的实用工具,用于使用Unix类似约定的嵌入式平台。这主要是从Rust标准库中复制粘贴的。
请注意,OsString和CString需要在您的Cargo.toml中启用alloc功能。
此模块提供了处理跨非Rust接口(如其他编程语言和底层操作系统)的数据的实用工具。它主要用于FFI(Foreign Function Interface)绑定和需要与其他语言交换类似C的字符串的代码。
概述
Rust使用String类型表示所有权的字符串,使用 [str] 原始类型表示字符串的借用切片。两者始终使用UTF-8编码,并且可能在中间包含空字节,即如果查看组成字符串的字节,其中可能包含一个 \0。 String 和 str 都显式存储其长度;与C中的字符串一样,字符串末尾没有空终止符。
C字符串与Rust字符串不同
-
编码 - Rust字符串是UTF-8,但C字符串可能使用其他编码。如果您正在使用来自C的字符串,您应明确检查其编码,而不仅仅是像在Rust中那样假设它是UTF-8。
-
字符大小 - C字符串可以使用大小为
char或wchar_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字符串的表示
CString 和 CStr 在需要将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],或者通过添加替换字符进行有损转换。
OsString 和 OsStr 在你需要将字符串从操作系统本身传输到其他地方,或者捕获外部命令的输出时非常有用。在 OsString、OsStr 和 Rust字符串之间的转换与 CString 和 CStr 的转换类似。
-
OsString表示操作系统偏好的任何表示形式下的所有字符串。在Rust标准库中,各种在操作系统之间传输字符串的API使用OsString而不是普通字符串。 -
OsStr表示一个指向字符串的借用引用,其格式可以传递给操作系统。它可以以与OsString相似的方式转换为UTF-8 Rust字符串切片。
转换
在Unix上
在Unix上,OsStr 实现了 OsStrExt trait,该trait为其添加了两个方法,from_bytes 和 as_bytes。这些方法进行从UTF-8字节切片到和从UTF-8字节切片的低价转换。
此外,在Unix上 OsString 实现了 OsStringExt trait,该trait提供了 from_vec 和 into_vec 方法,这些方法消耗其参数,并接受或产生 [u8] 向量。
依赖
~235–380KB