Estoy tratando de escribir un cliente TCP / IP simple en Rust y necesito imprimir el búfer que obtuve del servidor.
¿Cómo convierto a Vec<u8>
(o a &[u8]
) a a String
?
Para convertir un segmento de bytes en un segmento de cadena (asumiendo una codificación 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);
}
La conversión está en su lugar y no requiere una asignación. Puede crear un a String
partir del segmento de cadena si es necesario llamando .to_owned()
al segmento de cadena (hay otras opciones disponibles ).
La referencia de la biblioteca para la función de conversión:
from_utf8
no se asigna, vale la pena mencionar que necesita escanear los datos para validar la corrección de utf-8. Entonces, esta no es una operación O (1) (que uno puede pensar al principio)Yo prefiero
String::from_utf8_lossy
:Convierte bytes UTF-8 no válidos en , por lo que no se requiere manejo de errores. Es bueno para cuando no lo necesitas y yo apenas lo necesito. De hecho, obtienes un beneficio
String
de esto. Debería facilitar un poco la impresión de lo que obtiene del servidor.A veces, es posible que deba usar el
into_owned()
método, ya que se clona al escribir.fuente
into_owned()
sugerencia! Era exactamente lo que estaba buscando (esto hace que se convierta en un valor adecuadoString
que puede devolver como valor de retorno de un método, por ejemplo).Si realmente tiene un vector de bytes (
Vec<u8>
) y desea convertirlo aString
, lo más eficiente es reutilizar la asignación conString::from_utf8
:fuente
Vec
, pero los recién llegados no conocen las diferencias. Sin embargo, asegúrese de votar a favor de todas las preguntas y respuestas que resulten útiles.String::from_utf8_lossy
en su lugar aquí, entonces no necesita la llamada esperada .String::from_utf8_lossy
aquí, entonces no necesita laexpect
llamada, pero la entrada es una porción de bytes (&'a [u8]
). OTOH, también hayfrom_utf8_unchecked
. "Si está seguro de que el trozo byte es UTF-8 válidos, y no quiere incurrir en los gastos generales de la conversión, hay una versión insegura de esta función [from_utf8_lossy]
,from_utf8_unchecked
que tiene el mismo comportamiento, pero se salta los controles. "&vec_of_bytes
para convertir de nuevo en un segmento de bytes, como se indica en los ejemplos defrom_utf8_lossy
. doc.rust-lang.org/std/string/…