如何在 rust 中将字符串转换为字节向量?

109
这可能是最愚蠢的Rustlang问题,但我保证我已尽力在文档或网络上任何其他地方找答案。
我可以通过以下方式将字符串转换为字节向量:
let bar = bytes!("some string");

很遗憾,我不能以这种方式做到。

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

因为bytes!需要一个字符串字面量。

但是,我怎么把我的foo转换成一个字节向量呢?

3个回答

129

(&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]
}

顺带一提,类型转换函数的命名约定在这种情况下非常有用,因为它们可以让你大致知道可能要找的名称。


谢谢你的回答。你能把它应用到我的例子中,让我在bar中得到bytes!(foo)的等效结果吗?我尝试过let bar = (&foo).as_bytes,但似乎行不通。 - Christoph
更具体地说,它给我返回了这个编译错误:尝试在类型为&'static str的对象上调用方法as_bytes的值 - Christoph
你必须在后面加上 () 来调用它:foo.as_bytes()。我在我的回答中添加了一个示例。 - huon
1
哦,不。我现在真的感觉自己是StackOverflow上最愚蠢的人了。谢谢! - Christoph
1
@huon-dbaupp,使用Rust 1.2编译您的示例会出现the trait `core::fmt::Display` is not implemented for the type `[u8]` [E0277]。这是否意味着您的答案需要更新,将{}更改为{:?} - Quentin Pradet
5
要明确的是,生成的字节是UTF-8编码的,因为Rust存储strString时采用了这种编码方式。(从概念上讲,在谈论字符串的“字节”时,没有提到编码是没有意义的。) - jbg

24

为了扩展上面的答案,这里列出了一些不同类型之间的转换。

&str 转换为 &[u8]:

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

&str 转换为 Vec<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();

String 转换为 Vec<u8>:

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

在任何情况下,指定变量类型都是可选的。这只是为了避免混淆而已。

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


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

两种工作方式的区别,在某些库中使用字节所有权!!如果您使用as_bytes(),会看到编译器错误:必须是静态的。

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

但是如果您需要借用,请使用as_bytes()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接