web-dev-qa-db-fra.com

Comment convertir un vecteur d'octets (u8) en chaîne

J'essaye d'écrire un client TCP/IP simple dans Rust et je dois imprimer le tampon que j'ai reçu du serveur. Comment convertir le u8 vecteur à un String pour l'impression?

63
Athabaska Dick

Pour convertir une tranche d'octets en une chaîne (en supposant un codage 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 conversion est en place et ne nécessite aucune allocation. Vous pouvez créer un String à partir de la tranche de chaîne si nécessaire en appelant .to_owned() sur la tranche de chaîne ( d'autres options sont disponibles ).

La référence de la bibliothèque pour la fonction de conversion:

70
gavinb

Je préfère String::from_utf8_lossy :

fn main() {
    let buf = &[0x41u8, 0x41u8, 0x42u8];
    let s = String::from_utf8_lossy(buf);
    println!("result: {}", s);
}

Il transforme les octets UTF-8 non valides en � et évite le traitement des erreurs. C'est bon pour quand tu n'en as pas besoin et que j'en ai à peine besoin. En fait, vous obtenez un String. Cela devrait faciliter l’impression de ce que vous obtenez du serveur.

Parfois, vous devrez peut-être utiliser la méthode into_owned() car c'est un clone en écriture.

48
Bjorn Tipling

Si vous avez réellement un vecteur d'octets (Vec<u8>) et que vous voulez convertir en String, le plus efficace est de réutiliser l'allocation avec String::from_utf8 :

fn main() {
    let bytes = vec![0x41, 0x42, 0x43];
    let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
    println!("{}", s);
}
34
Shepmaster