Estou tentando escrever um cliente TCP / IP simples em Rust e preciso imprimir o buffer que obtive do servidor.
Como faço para converter um Vec<u8>
(ou a &[u8]
) em um String
?
Para converter uma fatia de bytes em uma fatia de string (assumindo uma codificação 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);
}
A conversão está em vigor e não requer uma alocação. Você pode criar um a String
partir da fatia da string, se necessário, chamando .to_owned()
a fatia da string ( outras opções estão disponíveis ).
A referência da biblioteca para a função de conversão:
from_utf8
não aloca, vale a pena mencionar que é necessário verificar os dados para validar a correção do utf-8. Portanto, esta não é uma operação O (1) (o que se pode pensar a princípio)Eu prefiro
String::from_utf8_lossy
:Ele transforma bytes UTF-8 inválidos em e, portanto, nenhum tratamento de erro é necessário. É bom para quando você não precisa disso e eu quase não preciso. Você realmente obtém um
String
com isso. Isso deve tornar a impressão do que você está obtendo do servidor um pouco mais fácil.Às vezes, você pode precisar usar o
into_owned()
método, pois é clone na gravação.fonte
into_owned()
sugestão! Era exatamente o que eu procurava (isso faz com que seja um próprioString
que você pode retornar como valor de retorno de um método, por exemplo).Se você realmente tem um vetor de bytes (
Vec<u8>
) e deseja converter para umString
, o mais eficiente é reutilizar a alocação comString::from_utf8
:fonte
Vec
, mas os novatos não conhecem as diferenças. No entanto, certifique-se de votar a favor de todas as perguntas e respostas que sejam úteis.String::from_utf8_lossy
aqui, então não precisa da chamada expect.String::from_utf8_lossy
vez disso aqui, então você não precisa daexpect
chamada, mas a entrada para isso é uma fatia de bytess (&'a [u8]
). OTOH, há tambémfrom_utf8_unchecked
. "Se você tem certeza que a fatia byte é válido UTF-8, e você não quer incorrer a sobrecarga da conversão, há uma versão insegura desta função [from_utf8_lossy]
,from_utf8_unchecked
que tem o mesmo comportamento, mas ignora os cheques. "&vec_of_bytes
para converter de volta em uma fatia de bytes, conforme listado nos exemplos defrom_utf8_lossy
. doc.rust-lang.org/std/string/…