code

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

codestyles 2020. 11. 7. 09:59
반응형

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


Rust로 간단한 TCP / IP 클라이언트를 작성하려고하는데 서버에서받은 버퍼를 출력해야합니다. 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);
}

참고 URL : https://stackoverflow.com/questions/19076719/how-do-i-convert-a-vector-of-bytes-u8-to-a-string

반응형