Rust로 간단한 TCP / IP 클라이언트를 작성하려고하는데 서버에서받은 버퍼를 출력해야합니다.
a Vec<u8>
(또는 a &[u8]
)를 로 어떻게 변환 String
합니까?
답변
바이트 조각을 문자열 조각으로 변환하려면 (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);
}
변환은 제자리에 있으며 할당이 필요하지 않습니다. String
필요한 경우 문자열 슬라이스를 호출하여 문자열 슬라이스에서 를 만들 수 있습니다 .to_owned()
( 다른 옵션을 사용할 수 있음 ).
변환 함수에 대한 라이브러리 참조 :
답변
나는 선호한다 String::from_utf8_lossy
:
fn main() {
let buf = &[0x41u8, 0x41u8, 0x42u8];
let s = String::from_utf8_lossy(buf);
println!("result: {}", s);
}
유효하지 않은 UTF-8 바이트를 로 변환하므로 오류 처리가 필요하지 않습니다. 그게 필요없고 거의 필요하지 않을 때 좋습니다. 당신은 실제로 이것에서 얻는다 String
. 서버에서 얻는 것을 조금 더 쉽게 인쇄 할 수 있습니다.
into_owned()
쓰기시 클론이기 때문에 때때로 메서드 를 사용해야 할 수도 있습니다 .
답변
실제로 바이트 ( Vec<u8>
) 벡터가 있고로 변환하려는 String
경우 가장 효율적인 방법은 String::from_utf8
다음 과 함께 할당을 재사용하는 것입니다 .
fn main() {
let bytes = vec![0x41, 0x42, 0x43];
let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
println!("{}", s);
}