Reputation: 28095
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?
Upvotes: 121
Views: 137939
Reputation: 2518
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
Upvotes: 32
Reputation: 5
`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()
Upvotes: -2
Reputation: 102256
(&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.
Upvotes: 145