web-dev-qa-db-ja.com

バイトのベクトル(u8)を文字列に変換する方法

Rustで単純なTCP/IPクライアントを作成しようとしています。サーバーから取得したバッファーを出力する必要があります。u8ベクトルをString印刷用?

63
Athabaska Dick

バイトのスライスを文字列スライスに変換するには(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);
}
_

変換はインプレースであり、割り当てを必要としません。必要に応じて、文字列スライスで.to_owned()を呼び出すことにより、文字列スライスからStringを作成できます( 他のオプションが利用可能 )。

変換関数のライブラリリファレンス:

70
gavinb

_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() メソッドを使用する必要がある場合があります。

48
Bjorn Tipling

実際にバイトのベクトルがある場合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);
}
34
Shepmaster