如何使用 Rust 将 CString 转换为字符串?

How do I convert a CString into a String with Rust?

提问人:Evan Carroll 提问时间:11/6/2023 最后编辑:cafce25Evan Carroll 更新时间:11/6/2023 访问量:78

问:

我有一个正在从磁盘读取的 CString。我用 CStr::from_bytes_until_nul 创建了它。不过,我的最终目标是拥有 ,而不是 .我正在尝试将我的存储到需要 .有没有从CString转换为String的方法?StringCStringCStringString

CString 是拥有的,并且似乎,

  • 保证没有内在\0
  • 保证有终端\0

A也是拥有的。似乎,String

  • 保证内容是 utf8。

为什么没有 from CString to String,它拉出终端并换行?.try_into()\0str::from_utf8(mycstring)

String Rust 类型转换 C-Strings

评论


答:

1赞 frankenapps 11/6/2023 #1

您可以使用 to_str() 将 CString 转换为 String,成功时会为您提供一个 &str(例如,u 只包含有效的 UTF-8 字符),然后可以通过调用 to_string() 将其转换为 StringCString

下面是一个简短的示例:

let cstring = CString::new("A string.").unwrap();
let string = cstring.to_str().unwrap().to_string();

以及 Rust Explorer 的链接。

关于你的第二个问题,我认为没有理由不应该进行转换,所以我的推测是,到目前为止,它根本没有实施。Github 上还有一个开放问题,正是要求这样做。try_into

评论

0赞 Evan Carroll 11/6/2023
虽然这是通过转换为切片,然后转换为字符串来工作的,但您正在制作副本,对吧?没有副本就不可能吗?
0赞 Cerberus 11/6/2023
它不应该。 确切地知道它在被丢弃时必须释放多少字节,但在语义上必须再丢弃一个字节(终止零)。因此,我们不能只是将一个的分配重用到另一个 - 大小不匹配。StringCString
2赞 Chayim Friedman 11/6/2023
@Cerberus可以保存大于其长度的分配。String
4赞 Aleksander Krauze 11/6/2023 #2

有方法本身into_string,它完全可以做你想做的事情。CString

评论

1赞 Evan Carroll 11/6/2023
谢谢,奇怪的是这是它自己的名字。