【问题标题】:How do I iterate over elements of a struct in Rust?如何在 Rust 中迭代结构的元素?
【发布时间】:2016-06-29 23:07:23
【问题描述】:

我正在编写一个用于加密网络通信的小型客户端/服务器程序,并具有以下结构以允许端点协商功能。

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...

有没有办法遍历字段并将它们的字节值推送到缓冲区中以进行发送?

【问题讨论】:

    标签: rust


    【解决方案1】:

    有没有办法遍历字段

    没有。你必须自己实现它,或者找一个宏/编译器插件来为你做。

    请参阅How to iterate or map over tuples? 了解类似问题。

    想想迭代器是如何工作的。迭代器必须为每次迭代产生一个 single 类型。对于由至少 3 种不同类型组成的结构,该类型是什么?

    【讨论】:

    • 如果编译器插件/nightly 是可以接受的,可以肯定 serde 在这里很有用。
    • @mcarton 你知道通用字节的 serde 适配器吗?还是您认为 OP 必须编写这样的适配器?
    • 什么意思? serde 本身可以从/到Vec<u8> 序列化。
    • @mcarton 很有趣!我假设 serde 可以使用 JSON 或 XML 或 MessagePack 之类的东西将结构输出到Vec<u8>,但不知道有一种模式可以将结构的所有字节混合在一起。我如何告诉 serde 在没有任何序列化格式的情况下输出 OP 的数据?
    【解决方案2】:

    Bincode 会这样做。

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

    来自自述文件:

    编码(以及解码)毫无疑问地继续进行——原始类型根据底层 Writer 进行编码,元组和结构通过逐一编码其字段进行编码,而枚举通过首先写出表示的标签进行编码变体,然后是内容。

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2021-11-24
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2016-07-17
      • 1970-01-01
      相关资源
      最近更新 更多