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


94

Rust로 간단한 TCP / IP 클라이언트를 작성하려고하는데 서버에서받은 버퍼를 출력해야합니다.

a Vec<u8>(또는 a &[u8])를 로 어떻게 변환 String합니까?

답변:


98

바이트 조각을 문자열 조각으로 변환하려면 (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()( 다른 옵션을 사용할 수 있음 ).

변환 함수에 대한 라이브러리 참조 :


VEC 슬라이스로 강제 변환하기 때문에이 가능하다는 것을 추가 할 수 있습니다
torkleyy

예제 코드는 실제로 벡터 :-) 사용하지 않지만
앤드류 매켄지

from_utf8할당하지 않는 것이 사실이지만 utf-8 정확성을 검증하기 위해 데이터를 스캔해야한다는 점을 언급 할 가치가 있습니다. 이 (하나는 처음에 생각)는 O (1) 작동되지 않도록
Zargony

64

나는 선호한다 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()쓰기시 클론이기 때문에 때때로 메서드 를 사용해야 할 수도 있습니다 .


3
into_owned()제안 해 주셔서 감사합니다 ! 정확히 내가 찾던 것이 었습니다 ( String예를 들어 메서드에서 반환 값으로 반환 할 수 있는 적절한 것이됩니다).
Per Lundberg

48

실제로 바이트 ( 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);
}

2
감사! 다른 두 답변이 질문을 무시한 이유는 무엇입니까?
Jehan

1
@Jehan은 사람들이 일반적으로 질문을 잘하지 않기 때문에 특히 언어를 처음 접할 때 그렇습니다. Rust는 array , slice 및 a Vec를 구분하지만 신규 이민자들은 차이점을 모릅니다. 유용한 것으로 입증 된 모든 질문과 답변에 찬성 투표를하세요.
Shepmaster

@Bjorn Tipling에서 언급했듯이 String::from_utf8_lossy여기에서 대신 사용할 수 있으므로 expect 호출이 필요하지 않습니다.
James Ray

2
편집 : @Bjorn Tipling에서 언급했듯이 String::from_utf8_lossy여기에서 대신 사용할 수 있다고 생각할 수 있으므로 expect호출이 필요하지 않지만 입력은 바이트 조각입니다 ( &'a [u8]). OTOH도있다 from_utf8_unchecked. "바이트 슬라이스가 유효한 UTF-8임을 확신하고 변환 오버 헤드를 발생시키지 않으려면이 함수의 안전하지 않은 버전이 있습니다 [ from_utf8_lossy],, from_utf8_unchecked동일한 동작을하지만 검사를 건너 뜁니다. "
James Ray

&vec_of_bytes의 예에 나열된대로를 사용 하여 다시 바이트 조각으로 변환 할 수 있습니다 from_utf8_lossy. doc.rust-lang.org/std/string/…
James Ray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.