MST

星途 面试题库

面试题:Rust中字符串与字节串的基本转换

在Rust中,如何将`String`类型转换为`Vec<u8>`字节串,又如何将`Vec<u8>`转换回`String`?请给出代码示例并解释可能遇到的陷阱。
20.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 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编码的字节序列,所以转换过程较为直接。

  2. Vec<u8>转换回String: 可以使用Stringfrom_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

  3. 可能遇到的陷阱

    • 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);
      }