如何将字节向量(u8)转换为字符串

时间:2013-09-29 10:03:36

标签: rust

我正在尝试在Rust中编写简单的TCP / IP客户端,我需要打印出从服务器获取的缓冲区。如何将u8向量转换为String进行打印?

4 个答案:

答案 0 :(得分:66)

将一片字节转换为字符串切片(假设采用UTF-8编码):

use std::str;

//
// pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error>
//
// Assuming buf: &[u8]
//

fn main() {

    let buf = &[0x41u8, 0x41u8, 0x42u8];

    let s = match str::from_utf8(buf) {
        Ok(v) => v,
        Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
    };

    println!("result: {}", s);
}

转换是就地的,不需要分配。如有必要,您可以通过在字符串切片(other options are available)上调用String从字符串切片创建.to_owned()

转换函数的库参考:

答案 1 :(得分:43)

我更喜欢String::from_utf8_lossy

fn main() {
    let buf = &[0x41u8, 0x41u8, 0x42u8];
    let s = String::from_utf8_lossy(buf);
    println!("result: {}", s);
}

它将无效的UTF-8字节转换为�,因此不需要进行错误处理。当你不需要它并且我几乎不需要它时,它是有益的。你实际上得到了String。它应该使你从服务器上获得的内容更容易打印出来。

有时您可能需要使用into_owned()方法,因为它会在写入时进行克隆。

答案 2 :(得分:32)

如果你实际上有一个字节向量Vec<u8>)并希望转换为String,那么效率最高的是重用{{3}的分配}:

fn main() {
    let bytes = vec![0x41, 0x42, 0x43];
    let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
    println!("{}", s);
}

答案 3 :(得分:0)

在我的情况下,我只需要根据某种编码将数字转换为字符串,而不是将数字转换为字母,所以我做到了

fn main() {
    let bytes = vec![0x41, 0x42, 0x43];
    let s = format!("{:?}", &bytes);
    println!("{}", s);
}