2016-06-29 6 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, но я в настоящее время, чтобы преобразовать их один на один раз.

send_buffer.extend_from_slice(kex_algorithms.as_bytes()); 
send_buffer.extend_from_slice(kgen_algorithms.as_bytes()); 
etc... 

Есть ли способ перебрать по полям и нажать их байтовые значения в буфер для отправки?

ответ

5

Есть ли способ для перебора над полями

No. Вы должны осуществить это самостоятельно, или найти макрос/компилятора плагин, который сделает это за вас.

См. Так же How to iterate or map over tuples?.

Подумайте, как работают итераторы. Итератор должен давать один тип для каждой итерации. Что бы этот тип был для вашей структуры, состоящий как минимум из трех разных типов?

+0

Довольно уверен, что serde может быть полезен здесь, если плагин компилятора/ночной приемлем. – mcarton

+0

@mcarton вы знаете о серде-адаптере для общих байтов? Или вы думаете, что OP должен был бы написать такой адаптер? – Shepmaster

+0

Что вы имеете в виду? Сама serde может сериализоваться с/на 'Vec '. – mcarton

0

Bincode делает это.

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

Из ридми:

Кодирование (и, таким образом декодирование) протекает не удивительно - примитивные типы кодируются в соответствии с базовой Writer, кортежи и структуры кодируются посредством кодирования их поля один за -one и перечисления кодируются, сначала выписывая тег, представляющий вариант, а затем содержимое.

Смежные вопросы