Saya mencoba untuk menulis klien TCP / IP sederhana di Rust dan saya perlu mencetak buffer yang saya dapatkan dari server.
Bagaimana cara mengubah a Vec<u8>
(atau a &[u8]
) menjadi a String
?
Saya mencoba untuk menulis klien TCP / IP sederhana di Rust dan saya perlu mencetak buffer yang saya dapatkan dari server.
Bagaimana cara mengubah a Vec<u8>
(atau a &[u8]
) menjadi a String
?
Jawaban:
Untuk mengonversi potongan byte menjadi potongan string (dengan asumsi pengkodean 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);
}
Konversi sudah ada, dan tidak memerlukan alokasi. Anda dapat membuat String
dari potongan string jika perlu dengan memanggil .to_owned()
potongan string ( opsi lain tersedia ).
Referensi perpustakaan untuk fungsi konversi:
from_utf8
tidak mengalokasikan, mungkin perlu disebutkan bahwa itu perlu memindai data untuk memvalidasi kebenaran utf-8. Jadi ini bukan operasi O (1) (yang mungkin dipikirkan pada awalnya)
Saya lebih suka String::from_utf8_lossy
:
fn main() {
let buf = &[0x41u8, 0x41u8, 0x42u8];
let s = String::from_utf8_lossy(buf);
println!("result: {}", s);
}
Ini mengubah byte UTF-8 yang tidak valid menjadi sehingga tidak diperlukan penanganan kesalahan. Itu bagus ketika Anda tidak membutuhkannya dan saya hampir tidak membutuhkannya. Anda benar-benar mendapatkan String
dari ini. Seharusnya mencetak apa yang Anda dapatkan dari server sedikit lebih mudah.
Kadang-kadang Anda mungkin perlu menggunakan into_owned()
metode ini karena itu kloning saat menulis.
into_owned()
sarannya! Persis seperti yang saya cari (ini membuatnya menjadi tepat String
yang dapat Anda kembalikan sebagai nilai kembali dari suatu metode, misalnya).
Jika Anda benar-benar memiliki vektor byte ( Vec<u8>
) dan ingin mengonversi menjadi String
, yang paling efisien adalah menggunakan kembali alokasi dengan 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
, tetapi pendatang baru tidak mengetahui perbedaannya. Pastikan untuk memberi suara positif pada semua pertanyaan dan jawaban yang terbukti berguna.
String::from_utf8_lossy
sebagai gantinya di sini, maka Anda tidak memerlukan panggilan yang diharapkan.
String::from_utf8_lossy
sebagai gantinya di sini, maka Anda tidak memerlukan expect
panggilan tersebut, tetapi masukan untuk itu adalah sepotong bytess ( &'a [u8]
). OTOH, ada juga from_utf8_unchecked
. "Jika Anda yakin bahwa slice byte berlaku UTF-8, dan Anda tidak ingin mendatangkan overhead konversi, ada versi tidak aman dari fungsi ini [ from_utf8_lossy]
, from_utf8_unchecked
, yang memiliki perilaku yang sama tapi melompat pemeriksaan. "
&vec_of_bytes
untuk mengonversi kembali menjadi potongan byte, seperti yang tercantum dalam contoh from_utf8_lossy
. doc.rust-lang.org/std/string/…