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
?
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
?
Réponses:
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
:
fn main() {
let buf = &[0x41u8, 0x41u8, 0x42u8];
let s = String::from_utf8_lossy(buf);
println!("result: {}", s);
}
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.
into_owned()
suggestion! C'était exactement ce que je cherchais (cela en fait un vrai String
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 a 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);
}
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 aussi from_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 de from_utf8_lossy
. doc.rust-lang.org/std/string/…