2016-06-29 9 views
2

私は、暗号化されたネットワーク通信のための小さなクライアント/サーバープログラムを作成しており、エンドポイントが機能をネゴシエートできるようにするために次の構造体を持っています。Rustの構造体の要素をどのように反復処理しますか?

struct KeyExchangePacket { 
    kexinit: u8, 
    replay_cookie: [u8; 32], 
    kex_algorithms: String, 
    kgen_algorithms: String, 
    encryption_algorithms: String, 
    mac_algorithms: String, 
    compression_algorithms: String, 
    supported_languages: String, 
} 

私はTcpStreamの上にそれらを送信するためにバイトにフィールドを変換する必要がありますが、私は現在、1度に1つずつを変換する必要があります。

フィールドを反復処理して送信するためのバイト値をバッファにプッシュする方法はありますか?

答えて

5

フィールド上であなたはそれを自分で実装するか、あなたのためにそれを行いますマクロ/コンパイラプラグインを見つける必要があり

号を反復処理する方法はあります。

同様の質問については、How to iterate or map over tuples?を参照してください。

イテレーターの仕組みについて考えてみましょう。イテレータは、反復ごとにの単一のタイプを生成する必要があります。あなたの構造体が少なくとも3つの異なる型から構成されている場合、その型は何でしょうか?

+0

コンパイラのプラグイン/夜間の受け入れが可能であれば、ここではserdeが役に立ちます。 – mcarton

+0

@mcarton一般的なバイト用のserdeアダプタについて知っていますか?あるいは、OPがそのようなアダプタを書かなければならないと思いますか? – Shepmaster

+0

どういう意味ですか? serde自体は 'Vec 'から/にシリアライズできます。 – mcarton

0

Bincodeこれです。 readmeファイルから

let packet = KeyExchangePacket { /* ... */ }; 
let size_limit = bincode::SizeLimit::Infinite; 
let encoded: Vec<u8> = bincode::serde::serialize(&packet, size_limit).unwrap(); 

符号化(ひいては復号)が当然進む - プリミティブ型は、基礎となるライター、タプルと構造体は、1つずつ、それらのフィールドを符号化して符号化されるに従って符号化されます-one、enumは、最初にバリアントを表すタグを書き出し、次に内容をエンコードします。

関連する問題