Я пытаюсь написать простой клиент TCP/IP в Rust и мне нужно распечатать буфер, который я получил с сервера. Как преобразовать вектор u8
в String
для печати?
Как преобразовать вектор байтов (u8) в строку
Ответ 1
Чтобы преобразовать срез байтов в срез строки (при условии кодировки 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
из среза, если это необходимо.
Справочник библиотеки для функции преобразования:
Ответ 2
Я предпочитаю 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()
, поскольку он клонируется при записи.
Ответ 3
Если у вас на самом деле есть вектор байтов (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);
}