Я пытаюсь написать простой клиент 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>
) и вы хотите преобразовать его в aString
, наиболее эффективным будет повторное использование выделения с помощью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/…