[rust] 벡터 바이트 (u8)를 문자열로 어떻게 변환합니까?

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);
}


답변