Reputation: 123
I'm writing a small client/server program for encrypted network communications and have the following struct to allow the endpoints to negotiate capabilities.
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,
}
I need to convert the fields into bytes in order to send them over a TcpStream
, but I currently have to convert them one at a time.
send_buffer.extend_from_slice(kex_algorithms.as_bytes());
send_buffer.extend_from_slice(kgen_algorithms.as_bytes());
etc...
Is there a way to iterate over the fields and push their byte values into a buffer for sending?
Upvotes: 12
Views: 16696
Reputation: 10993
Bincode does this.
let packet = KeyExchangePacket { /* ... */ };
let size_limit = bincode::SizeLimit::Infinite;
let encoded: Vec<u8> = bincode::serde::serialize(&packet, size_limit).unwrap();
From the readme:
The encoding (and thus decoding) proceeds unsurprisingly -- primitive types are encoded according to the underlying Writer, tuples and structs are encoded by encoding their fields one-by-one, and enums are encoded by first writing out the tag representing the variant and then the contents.
Upvotes: 4
Reputation: 430671
Is there a way to iterate over the fields
No. You have to implement it yourself, or find a macro / compiler plugin that will do it for you.
See How to iterate or map over tuples? for a similar question.
Think about how iterators work. An iterator has to yield a single type for each iteration. What would that type be for your struct composed of at least 3 different types?
Upvotes: 15