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
?
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
: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.sumber
into_owned()
sarannya! Persis seperti yang saya cari (ini membuatnya menjadi tepatString
yang dapat Anda kembalikan sebagai nilai kembali dari suatu metode, misalnya).Jika Anda benar-benar memiliki vektor byte (
Vec<u8>
) dan ingin mengonversi menjadiString
, yang paling efisien adalah menggunakan kembali alokasi denganString::from_utf8
:sumber
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 memerlukanexpect
panggilan tersebut, tetapi masukan untuk itu adalah sepotong bytess (&'a [u8]
). OTOH, ada jugafrom_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 contohfrom_utf8_lossy
. doc.rust-lang.org/std/string/…