172

我正在尝试用 Rust 编写简单的 TCP/IP 客户端,我需要打印出从服务器获得的缓冲区。

如何将 a Vec<u8>(或 a &[u8])转换为 a String

4

4 回答 4

180

要将字节切片转换为字符串切片(假设为 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);
}

转换是就地的,不需要分配。String如有必要,您可以通过调用字符串切片从字符串切片创建一个.to_owned()其他选项可用)。

转换函数的库参考:

于 2013-09-29T10:19:15.373 回答
112

我更喜欢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()方法,因为它是在写入时克隆的。

于 2016-01-10T18:12:17.227 回答
71

如果您实际上有一个字节向量( Vec<u8>) 并且想要转换为 a String,那么最有效的方法是重用分配String::from_utf8

fn main() {
    let bytes = vec![0x41, 0x42, 0x43];
    let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
    println!("{}", s);
}
于 2016-06-01T23:45:31.793 回答
2

就我而言,我只需要将数字转换为字符串,而不是根据某种编码将数字转换为字母,所以我做了

fn main() {
    let bytes = vec![0x41, 0x42, 0x43];
    let s = format!("{:?}", &bytes);
    println!("{}", s);
}
于 2021-06-20T04:11:45.690 回答