Ich versuche, einen einfachen TCP / IP-Client in Rust zu schreiben, und ich muss den Puffer ausdrucken, den ich vom Server erhalten habe.
Wie konvertiere ich ein Vec<u8>
(oder ein &[u8]
) in ein String
?
So konvertieren Sie ein Byte-Slice in ein String-Slice (unter der Annahme einer UTF-8-Codierung):
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);
}
Die Konvertierung ist vorhanden und erfordert keine Zuordnung. Sie können String
bei Bedarf ein aus dem String-Slice erstellen, indem Sie .to_owned()
das String-Slice aufrufen ( andere Optionen sind verfügbar ).
Die Bibliotheksreferenz für die Konvertierungsfunktion:
from_utf8
keine Zuordnung erfolgt, kann es erwähnenswert sein, dass die Daten gescannt werden müssen, um die Richtigkeit von utf-8 zu überprüfen. Dies ist also keine O (1)Ich bevorzuge
String::from_utf8_lossy
:Ungültige UTF-8-Bytes werden in umgewandelt, sodass keine Fehlerbehandlung erforderlich ist. Es ist gut, wenn du das nicht brauchst und ich es kaum brauche. Sie bekommen tatsächlich eine
String
davon. Dies sollte das Ausdrucken der vom Server erhaltenen Daten etwas vereinfachen.Manchmal müssen Sie die
into_owned()
Methode möglicherweise verwenden , da sie beim Schreiben geklont wird.quelle
into_owned()
Vorschlag! War genau das,String
wonach ich gesucht habe (dies macht es zu einem Eigenwert, den Sie beispielsweise als Rückgabewert von einer Methode zurückgeben können).Wenn Sie tatsächlich einen Vektor von bytes (
Vec<u8>
) haben und in a konvertieren möchtenString
, ist es am effizientesten, die Zuordnung wiederzuverwenden mitString::from_utf8
:quelle
Vec
, aber Neulinge kennen die Unterschiede nicht. Stellen Sie sicher, dass Sie alle Fragen und Antworten, die sich jedoch als nützlich erweisen, positiv bewerten.String::from_utf8_lossy
stattdessen hier verwenden können, dann benötigen Sie den Expect-Aufruf nicht.String::from_utf8_lossy
stattdessen hier verwenden können, dann brauchen Sie denexpect
Aufruf nicht, aber die Eingabe dazu ist ein Stück Bytess (&'a [u8]
). OTOH gibt es auchfrom_utf8_unchecked
. "Wenn Sie sicher sind, dass das Byte-Slice UTF-8 gültig ist und Sie keinen Overhead für die Konvertierung verursachen möchten, gibt es eine unsichere Version dieser Funktion [from_utf8_lossy]
,from_utf8_unchecked
die dasselbe Verhalten aufweist, aber die Überprüfungen überspringt. ""&vec_of_bytes
Konvertierung in eine Byte-Schicht verwenden können, wie in den Beispielen von aufgeführtfrom_utf8_lossy
. doc.rust-lang.org/std/string/…