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


94

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

Vec<u8>(またはa &[u8])をa に変換するにはどうすればよい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

コード例では実際にはベクターを使用していませんが:-)
Andrew Mackenzie

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、たとえば、メソッドからの戻り値として返すことができる適切なものになります)。
Lundberg

47

実際にバイトのベクトル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
ありがとう!他の2つの回答が質問を無視したのはなぜですか?
Jehan 2017年

1
@Jehanは、人々が一般的に質問をするのが得意ではないためです。特に、言語に不慣れな場合はそうです。錆は間違いになり、配列スライスVec、しかし、新規参入者は違いを知りません。ただし、有用であることが判明したすべての質問と回答に必ず賛成票を投じてください。
Shepmaster

@Bjorn Tiplingで述べたようString::from_utf8_lossyに、ここでは代わりに使用でき、expect呼び出しは必要ありません。
ジェームズレイ

2
編集:@Bjorn Tiplingで言及されているように、String::from_utf8_lossyここでは代わりに使用できると思うかもしれませんが、expect呼び出しは必要ありませんが、その入力はバイト(&'a [u8])のスライスです。OTOH、もありfrom_utf8_uncheckedます。「あなたは、バイトスライスが有効なUTF-8であることを確信している、とあなたは、変換のオーバーヘッドが発生しない場合、この関数の危険なバージョンがある[ from_utf8_lossy]from_utf8_unchecked、同じ動作を持っていますが、チェックをスキップしています。 」
ジェームズレイ

&vec_of_bytesの例に示すように、を使用してバイトのスライスに戻すことができることに注意してくださいfrom_utf8_lossydoc.rust-lang.org/std/string/...
ジェームズ・レイに
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.