如何将字节(u8)的向量转换为string
我正在尝试在Rust中编写简单的TCP / IP客户端,并且需要打印出从服务器获得的缓冲区。 如何将u8
vector转换为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); }