Я пытаюсь написать простой клиент TCP / IP в Rust, и мне нужно распечатать буфер, который я получил с сервера.
Как мне преобразовать Vec<u8>
(или &[u8]
) в String
?
Я пытаюсь написать простой клиент TCP / IP в Rust, и мне нужно распечатать буфер, который я получил с сервера.
Как мне преобразовать Vec<u8>
(или &[u8]
) в 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);
}
Преобразование выполняется на месте и не требует выделения. При необходимости вы можете создать String
из фрагмента строки, вызвав .to_owned()
этот фрагмент ( доступны другие параметры ).
Ссылка на библиотеку для функции преобразования:
from_utf8
не выделяется, возможно, стоит упомянуть, что для проверки правильности utf-8 необходимо сканировать данные. Так что это не операция O (1) (о которой сначала можно подумать)
Я предпочитаю 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()
метод, поскольку он клонируется при записи.
into_owned()
предложение! Это именно то, что я искал (это делает его подходящим, String
который вы можете возвращать как возвращаемое значение из метода, например).
Если у вас действительно есть вектор bytes ( 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);
}
Vec
, но новички не знают различий. Не забудьте проголосовать за все вопросы и ответы, которые окажутся полезными.
String::from_utf8_lossy
вместо этого здесь, тогда вам не нужен ожидаемый вызов.
String::from_utf8_lossy
вместо этого здесь, тогда вам не нужен expect
вызов, но вход в него - это фрагмент bytess ( &'a [u8]
). OTOH, тоже есть from_utf8_unchecked
. «Если вы уверены , что срез байт действителен UTF-8, и вы не хотите брать на себя накладные расходы на преобразование, есть небезопасная версия этой функции [ from_utf8_lossy]
, from_utf8_unchecked
, которая имеет такое же поведение , но пропускает проверку. "
&vec_of_bytes
для обратного преобразования в фрагмент байтов, как указано в примерах from_utf8_lossy
. doc.rust-lang.org/std/string/…