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