¿Cómo convierto un Vector de bytes (u8) en una cadena?

Resuelto Athabaska Dick asked hace 11 años • 6 respuestas

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?

Athabaska Dick avatar Sep 29 '13 17:09 Athabaska Dick
Aceptado

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 Stringsegmento 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_uncheckedque 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
gavinb avatar Sep 29 '2013 10:09 gavinb

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 Stringde 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.

Bjorn avatar Jan 10 '2016 18:01 Bjorn

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);
}
Shepmaster avatar Jun 01 '2016 23:06 Shepmaster

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);
}
PPP avatar Jun 20 '2021 04:06 PPP