如何将字符串转换为锈迹中的字节向量?

这可能是有史以来最愚蠢的 Rustlang 问题,但是我保证我会尽我最大的努力在文档或者网络上的任何其他地方找到答案。

我可以像下面这样将字符串转换为字节向量:

let bar = bytes!("some string");

不幸的是,我不能这样做

let foo = "some string";
let bar = bytes!(foo);

因为 bytes!需要字符串文字。

但是,如何将 foo 转换为字节矢量呢?

74951 次浏览

(&str).as_bytes 给你一个字符串的视图,作为一个 &[u8]字节片(这可以在 String上调用,因为这个解析器指向 str,而且 String.into_bytes将使用一个 String来给你一个 Vec<u8>

如果不需要字节的所有权,请使用 .as_bytes版本。

fn main() {
let string = "foo";
println!("{:?}", string.as_bytes()); // prints [102, 111, 111]
}

顺便说一下,转换函数的命名约定在这样的情况下很有用,因为它们允许您大致知道您可能正在寻找的名称。

 `let v1: Vec<u8> = string.encode_to_vec();`
`let v2: &[u8]   = string.as_bytes();`

两个工作区别,在一些图书馆使用字节的所有权! !如果使用 as _ bytes () ,请参见编译器错误: 必须是静态的。

例如: tokio_uring::fs::File::write_at() 获得字节的所有权! !

但是如果需要借用,请使用 as _ bytes ()

以展开上面的答案。下面是一些不同类型之间的转换。

&str&[u8]:

let my_string: &str = "some string";
let my_bytes: &[u8] = my_string.as_bytes();

&strVec<u8>:

let my_string: &str = "some string";
let my_bytes: Vec<u8> = my_string.as_bytes().to_vec();

String&[u8]:

let my_string: String = "some string".to_owned();
let my_bytes: &[u8] = my_string.as_bytes();

StringVec<u8>:

let my_string: String = "some string".to_owned();
let my_bytes: Vec<u8> = my_string.into_bytes();

在所有情况下,指定变量类型都是可选的。只是添加以避免混淆。

游乐场连结: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=5ad228e45a38b4f097bbbba49100ecfc