J'essaie d'écrire un client TCP / IP simple dans Rust et j'ai besoin d'imprimer le tampon que j'ai obtenu du serveur.
Comment convertir un Vec<u8>
(ou un &[u8]
) en un String
?
Pour convertir une tranche d'octets en une tranche de chaîne (en supposant un encodage 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 pas d'allocation. Vous pouvez créer un à String
partir de la tranche de chaîne si nécessaire en appelant .to_owned()
la tranche de chaîne (d' autres options sont disponibles ).
La référence de la bibliothèque pour la fonction de conversion:
from_utf8
cela n'alloue pas, il peut être utile de mentionner qu'il doit analyser les données pour valider l'exactitude de l'utf-8. Ce n'est donc pas une opération O (1) (à laquelle on peut penser au début)Je préfère
String::from_utf8_lossy
:Il transforme les octets UTF-8 invalides en et donc aucune gestion d'erreur n'est requise. C'est bon lorsque vous n'en avez pas besoin et que j'en ai à peine besoin. Vous obtenez en fait un
String
de cela. Cela devrait faciliter un peu l'impression de ce que vous obtenez du serveur.Parfois, vous devrez peut-être utiliser la
into_owned()
méthode car elle est clonée en écriture.la source
into_owned()
suggestion! C'était exactement ce que je cherchais (cela en fait un vraiString
que vous pouvez retourner comme valeur de retour d'une méthode, par exemple).Si vous avez réellement un vecteur d'octets (
Vec<u8>
) et que vous souhaitez convertir en aString
, le plus efficace est de réutiliser l'allocation avecString::from_utf8
:la source
Vec
, mais les nouveaux venus ne connaissent pas les différences. Assurez-vous de voter pour toutes les questions et réponses qui s'avèrent utiles.String::from_utf8_lossy
place ici, alors vous n'avez pas besoin de l'appel attendu.String::from_utf8_lossy
place ici, alors vous n'avez pas besoin de l'expect
appel, mais l'entrée est une tranche de bytess (&'a [u8]
). OTOH, il y a aussifrom_utf8_unchecked
. « Si vous êtes sûr que la tranche d'octet est valide UTF-8, et vous ne voulez pas encourir les frais généraux de la conversion, il existe une version non sécuritaire de cette fonction [from_utf8_lossy]
,from_utf8_unchecked
qui a le même comportement , mais ignore les contrôles. "&vec_of_bytes
pour reconvertir en une tranche d'octets, comme indiqué dans les exemples defrom_utf8_lossy
. doc.rust-lang.org/std/string/…