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
?
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
?
Respostas:
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
:
fn main() {
let buf = &[0x41u8, 0x41u8, 0x42u8];
let s = String::from_utf8_lossy(buf);
println!("result: {}", s);
}
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.
into_owned()
sugestão! Era exatamente o que eu procurava (isso faz com que seja um próprio String
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 um String
, o mais eficiente é reutilizar a alocação com 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
, 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 da expect
chamada, mas a entrada para isso é uma fatia de bytess ( &'a [u8]
). OTOH, há também from_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 de from_utf8_lossy
. doc.rust-lang.org/std/string/…