如何将字节(u8)的向量转换为string

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

将一段字节转换为一个string切片(假设采用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); } 

转换是就地的,不需要分配。 如有必要,您可以从片中创build一个String

转换函数的库参考:

  • std::str::from_utf8

我更喜欢String::from_utf8_lossy

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

它将无效的UTF-8字节变成 ,因此不需要进行error handling。 当你不需要的时候,这很好,我几乎不需要它。 你实际上从这里得到一个String 。 它应该打印出你从服务器上得到的更容易一些。

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

如果实际上有一个字节向量Vec<u8> ),并且想要转换为一个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); }