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

Type ConversionRust

Type Conversion Problem Overview


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?

Type Conversion Solutions


Solution 1 - Type Conversion

(&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.

Solution 2 - Type Conversion

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

Solution 3 - Type Conversion

 `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()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChristophView Question on Stackoverflow
Solution 1 - Type ConversionhuonView Answer on Stackoverflow
Solution 2 - Type ConversionRalph BisschopsView Answer on Stackoverflow
Solution 3 - Type ConversionDanyal MhView Answer on Stackoverflow