2016-06-29 5 views
2

Ich schreibe ein kleines Client/Server-Programm für die verschlüsselte Netzwerkkommunikation und habe die folgende Struktur, damit die Endpunkte Fähigkeiten aushandeln können.Wie iteriere ich über Elemente einer Struktur in 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, 
} 

Ich brauche die Felder in Bytes zu konvertieren, um sie über einen TcpStream zu schicken, aber ich habe noch sie einer nach dem anderen zu konvertieren.

Gibt es eine Möglichkeit, über die Felder zu iterieren und ihre Byte-Werte in einen Puffer zum Senden zu schieben?

Antwort

5

Gibt es eine Möglichkeit über die Felder iterieren

Nein, Sie haben es selbst zu implementieren, oder ein Makro/Compiler-Plugin finden, dass es für Sie tun.

Eine ähnliche Frage finden Sie unter How to iterate or map over tuples?.

Denken Sie darüber nach, wie Iteratoren arbeiten. Ein Iterator muss für jede Iteration einen einzelnen Typ ergeben. Was wäre dieser Typ für Ihre Struktur aus mindestens 3 verschiedenen Typen?

+0

Ziemlich sicher serde könnte hier nützlich sein, wenn ein Compiler-Plugin/Nightly akzeptabel ist. – mcarton

+0

@mcarton kennen Sie einen Serde-Adapter für generische Bytes? Oder meinst du, dass OP einen solchen Adapter schreiben müsste? – Shepmaster

+0

was meinst du? serde selbst kann von/nach 'Vec ' serialisieren. – mcarton

0

Bincode tut dies.

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

Von der Info:

Die Codierung (Decodierung und somit) verläuft unsurprisingly - Urtyp gemäß der zugrunde liegenden Writer codiert sind, werden Tupel und structs durch Codieren ihre Felder codiert one-by -one, und Enums werden codiert, indem zuerst das Tag, das die Variante darstellt, und dann der Inhalt ausgeschrieben wird.

Verwandte Themen