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

Chr*_*oph 20 type-conversion rust

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

我可以将字符串转换为字节向量,如下所示:

let bar = bytes!("some string");
Run Code Online (Sandbox Code Playgroud)

不幸的是我不能这样做

let foo = "some string";
let bar = bytes!(foo);
Run Code Online (Sandbox Code Playgroud)

因为bytes!需要一个字符串文字.

但是,如何将我的foo转换为字节向量?

huo*_*uon 27

(&str).as_bytes给你一个字符串的视图作为一个&[u8]字节切片(可以调用,String因为它derefs str,并且String.into_bytes还会消耗一个String给你一个Vec<u8>.

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

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

顺便说一句,转换函数命名约定在这些情况下很有用,因为它们可以让您大致了解您可能要查找的名称.

  • 需要明确的是,生成的字节采用 UTF-8 编码,因为 Rust 就是这样存储 `str` 和 `String` 的。(从概念上讲,在不讨论编码的情况下讨论“字符串的字节”是没有任何意义的。) (5认同)

Ral*_*ops 25

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

&str&[u8]

let my_string: &str = "some string";
let my_bytes: &[u8] = my_string.as_bytes();
Run Code Online (Sandbox Code Playgroud)

&strVec<u8>

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

String&[u8]

let my_string: String = "some string".to_owned();
let my_bytes: &[u8] = my_string.as_bytes();
Run Code Online (Sandbox Code Playgroud)

StringVec<u8>

let my_string: String = "some string".to_owned();
let my_bytes: Vec<u8> = my_string.into_bytes();
Run Code Online (Sandbox Code Playgroud)

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

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