简体   繁体   中英

How do I convert a string into a vector of bytes in rust?

That might be the dumbest Rustlang question ever but I promise I tried my best to find the answer in the documentation or any other place on the web.

I can convert a string to a vector of bytes like this:

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

Unfortunately I can't do it this way

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

Because bytes! expects a string literal.

But then, how do I get my foo converted into a vector of bytes?

(&str).as_bytes gives you a view of a string as a &[u8] byte slice (that can be called on String since that derefs to str , and there's also String.into_bytes will consume a String to give you a Vec<u8> .

Use the .as_bytes version if you don't need ownership of the bytes.

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

BTW, The naming conventions for conversion functions are helpful in situations like these, because they allow you to know approximately what name you might be looking for.

To expand the answers above. Here are a few different conversions between types.

&str to &[u8] :

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

&str to Vec<u8> :

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

String to &[u8] :

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

String to Vec<u8> :

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

Specifying the variable type is optional in all cases. Just added to avoid confusion.

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

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

two work difference, in some of library use ownership of bytes !! if you use as_bytes() see compiler error: must be static.

for example: tokio_uring::fs::File::write_at() get a ownership of bytes !!

but if you need borrowing , use as_bytes()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM