¿Cómo convierto un Vector de bytes (u8) en una cadena?
Estoy intentando 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]
) en 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 marcha y no requiere una asignación. Puede crear un String
segmento de cadena si es necesario llamando .to_owned()
al segmento de cadena ( hay otras opciones disponibles ).
Si está seguro de que el segmento de bytes es UTF-8 válido y no desea incurrir en la sobrecarga de la verificación de validez, existe una versión no segura de esta función, from_utf8_unchecked
que tiene el mismo comportamiento pero omite la verificación.
Si necesita una cadena en lugar de &str, también puede considerarlo String::from_utf8
.
Las referencias de la biblioteca para la función de conversión:
std::str::from_utf8
std::str::from_utf8_unchecked
std::string::String::from_utf8
Yo prefiero String::from_utf8_lossy
:
fn main() {
let buf = &[0x41u8, 0x41u8, 0x42u8];
let s = String::from_utf8_lossy(buf);
println!("result: {}", s);
}
Convierte bytes UTF-8 no válidos en � y, por lo tanto, 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 necesites utilizar el into_owned()
método, ya que se clona al escribir.
Si realmente tiene un vector de bytes ( Vec<u8>
) y desea convertirlo a String
, lo más eficiente es reutilizar la asignación con String::from_utf8
:
fn main() {
let bytes = vec![0x41, 0x42, 0x43];
let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
println!("{}", s);
}
En mi caso sólo necesitaba convertir los números en una cadena, no los números en letras según alguna codificación, así que lo hice
fn main() {
let bytes = vec![0x41, 0x42, 0x43];
let s = format!("{:?}", &bytes);
println!("{}", s);
}