MST

星途 面试题库

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

在Rust中,如何将`String`类型转换为`Vec<u8>`类型(字节串),又如何将`Vec<u8>`类型转换回`String`类型?请给出代码示例,并说明转换过程中可能遇到的问题及解决方案。
27.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

String 转换为 Vec<u8>

可以使用 Stringinto_bytes 方法将 String 转换为 Vec<u8>。示例代码如下:

fn main() {
    let s = String::from("hello");
    let bytes: Vec<u8> = s.into_bytes();
    println!("{:?}", bytes);
}

Vec<u8> 转换为 String

可以使用 Stringfrom_utf8 方法将 Vec<u8> 转换为 String。示例代码如下:

fn main() {
    let bytes = vec![104, 101, 108, 108, 111];
    let s = String::from_utf8(bytes);
    match s {
        Ok(s) => println!("{}", s),
        Err(e) => println!("转换错误: {:?}", e),
    }
}

转换过程中可能遇到的问题及解决方案

  1. from_utf8 失败from_utf8 方法要求 Vec<u8> 中的字节必须是有效的 UTF - 8 编码。如果字节序列不是有效的 UTF - 8 编码,from_utf8 会返回一个 Err。 解决方案:在调用 from_utf8 之前,确保字节序列是有效的 UTF - 8 编码。如果不确定,可以先使用 std::str::from_utf8 进行验证,它会返回一个 Result<&str, Utf8Error>,如果验证通过再转换为 String。示例代码如下:
fn main() {
    let bytes = vec![104, 101, 108, 108, 111];
    let result = std::str::from_utf8(&bytes);
    match result {
        Ok(s) => {
            let s = String::from(s);
            println!("{}", s);
        },
        Err(e) => println!("验证错误: {:?}", e),
    }
}
  1. into_bytes 丢失信息into_bytes 方法会按照 UTF - 8 编码规则将字符串转换为字节序列。如果原始字符串包含非 ASCII 字符,字节序列可能与直观预期不同。 解决方案:如果需要保留字符信息,可以考虑使用其他编码格式,如 UTF - 16,不过在 Rust 中处理 UTF - 16 不像处理 UTF - 8 那样原生和方便。一般情况下,使用 UTF - 8 是符合现代编程习惯和互联网标准的,在大多数场景下不会有问题。