Подтвердить что ты не робот

Как преобразовать вектор байтов (u8) в строку

Я пытаюсь написать простой клиент TCP/IP в Rust и мне нужно распечатать буфер, который я получил с сервера. Как преобразовать вектор u8 в String для печати?

4b9b3361

Ответ 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);
}