Rust: [u8] 与 String 相互转换
在 Rust 中,[u8]
和 String
是两种不同的数据类型,用于表示不同的数据结构。[u8]
是一个字节数组,通常用于表示二进制数据或字节字符串,而 String
是一个 UTF-8 编码的字符串。
以下是如何在 [u8]
和 String
之间进行相互转换的示例:
从 [u8]
转换为 String
要从 [u8]
转换为 String
,你需要确保 [u8]
数组中的字节是有效的 UTF-8 编码。如果数据是有效的 UTF-8,你可以使用 String::from_utf8
方法。如果数据可能不是有效的 UTF-8,你可以使用 String::from_utf8_lossy
方法,它会替换无效的字节。
use std::string::FromUtf8Error;
fn u8_to_string(bytes: &[u8]) -> Result<String, FromUtf8Error> {
String::from_utf8(bytes.to_vec())
}
fn main() {
let bytes = b"hello world";
match u8_to_string(bytes) {
Ok(s) => println!("String: {}", s),
Err(e) => println!("Error: {:?}", e),
}
}
如果你不介意丢失数据,可以使用 String::from_utf8_lossy
:
use std::string::String;
fn u8_to_string_lossy(bytes: &[u8]) -> String {
String::from_utf8_lossy(bytes).to_string()
}
fn main() {
let bytes = vec![0x68, 0x65, 0x6C, 0xFF, 0x6F]; // 'hello' with an invalid byte 0xFF
let s = u8_to_string_lossy(&bytes);
println!("String (lossy): {}", s); // Output will replace invalid bytes
}
从 String
转换为 [u8]
要从 String
转换为 [u8]
,你可以使用 String
的 as_bytes
方法,这会返回一个 &[u8]
切片,或者你可以使用 into_bytes
方法,这会消耗 String
并返回一个 Vec<u8>
。
fn string_to_u8_slice(s: &String) -> &[u8] {
s.as_bytes()
}
fn string_to_u8_vec(s: String) -> Vec<u8> {
s.into_bytes()
}
fn main() {
let s = String::from("hello world");
let bytes_slice = string_to_u8_slice(&s);
let bytes_vec = string_to_u8_vec(s.clone());
println!("Bytes slice: {:?}", bytes_slice);
println!("Bytes vec: {:?}", bytes_vec);
}
总结
- 使用
String::from_utf8
将有效的 UTF-8 字节数组转换为String
。 - 使用
String::from_utf8_lossy
将可能不是有效 UTF-8 的字节数组转换为String
,但会替换无效字节。 - 使用
String::as_bytes
获取&[u8]
切片。 - 使用
String::into_bytes
将String
转换为Vec<u8>
。
这些方法应满足你在 Rust 中处理 String
和 [u8]
相互转换的大部分需求。