面试题答案
一键面试-
将
String
转换为Vec<u8>
: 在Rust中,可以使用String
类型的into_bytes
方法将String
转换为Vec<u8>
。示例代码如下:fn main() { let s = String::from("hello"); let bytes: Vec<u8> = s.into_bytes(); println!("{:?}", bytes); }
这里
into_bytes
方法会把String
对象的内部字节所有权转移并返回一个Vec<u8>
。String
本质上是UTF - 8编码的字节序列,所以转换过程较为直接。 -
将
Vec<u8>
转换回String
: 可以使用String
的from_utf8
方法将Vec<u8>
转换为String
。示例代码如下:fn main() { let bytes = vec![104, 101, 108, 108, 111]; let result = String::from_utf8(bytes); match result { Ok(s) => println!("{}", s), Err(e) => println!("Error: {:?}", e), } }
from_utf8
方法尝试将Vec<u8>
解释为有效的UTF - 8编码字符串。如果字节序列不是有效的UTF - 8编码,from_utf8
会返回一个Err
,错误类型为FromUtf8Error
。 -
可能遇到的陷阱:
- UTF - 8编码问题:当将
Vec<u8>
转换回String
时,字节序列必须是有效的UTF - 8编码。如果字节序列包含无效的UTF - 8编码,from_utf8
会失败。例如:fn main() { let bad_bytes = vec![0xff];// 无效的UTF - 8字节 let result = String::from_utf8(bad_bytes); match result { Ok(s) => println!("{}", s), Err(e) => println!("Error: {:?}", e),// 会打印错误信息 } }
- 所有权转移:当使用
into_bytes
时,String
对象的所有权被转移到Vec<u8>
中,原String
对象不再可用。如果后续还需要使用原String
的内容,需要提前进行克隆或其他处理。例如:fn main() { let s = String::from("hello"); let bytes1: Vec<u8> = s.clone().into_bytes();// 使用clone方法保留原String println!("{}", s); }
- UTF - 8编码问题:当将