Rust로 간단한 TCP / IP 클라이언트를 작성하려고하는데 서버에서받은 버퍼를 출력해야합니다.
a Vec<u8>
(또는 a &[u8]
)를 로 어떻게 변환 String
합니까?
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()
( 다른 옵션을 사용할 수 있음 ).
변환 함수에 대한 라이브러리 참조 :
from_utf8
할당하지 않는 것이 사실이지만 utf-8 정확성을 검증하기 위해 데이터를 스캔해야한다는 점을 언급 할 가치가 있습니다. 이 (하나는 처음에 생각)는 O (1) 작동되지 않도록
나는 선호한다 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()
쓰기시 클론이기 때문에 때때로 메서드 를 사용해야 할 수도 있습니다 .
into_owned()
제안 해 주셔서 감사합니다 ! 정확히 내가 찾던 것이 었습니다 ( String
예를 들어 메서드에서 반환 값으로 반환 할 수 있는 적절한 것이됩니다).
실제로 바이트 ( 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);
}
Vec
를 구분하지만 신규 이민자들은 차이점을 모릅니다. 유용한 것으로 입증 된 모든 질문과 답변에 찬성 투표를하세요.
String::from_utf8_lossy
여기에서 대신 사용할 수 있으므로 expect 호출이 필요하지 않습니다.
String::from_utf8_lossy
여기에서 대신 사용할 수 있다고 생각할 수 있으므로 expect
호출이 필요하지 않지만 입력은 바이트 조각입니다 ( &'a [u8]
). OTOH도있다 from_utf8_unchecked
. "바이트 슬라이스가 유효한 UTF-8임을 확신하고 변환 오버 헤드를 발생시키지 않으려면이 함수의 안전하지 않은 버전이 있습니다 [ from_utf8_lossy]
,, from_utf8_unchecked
동일한 동작을하지만 검사를 건너 뜁니다. "
&vec_of_bytes
의 예에 나열된대로를 사용 하여 다시 바이트 조각으로 변환 할 수 있습니다 from_utf8_lossy
. doc.rust-lang.org/std/string/…