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

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

有没有一种方法可以遍历这些字段,并将它们的字节值推送到缓冲区中进行发送?

推荐答案

有没有一种方法可以遍历这些字段

不,你必须自己实现它,或者找到一个宏/编译器插件来为你实现它.

类似问题见How to iterate or map over tuples?.

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

Rust相关问答推荐

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

为什么这是&q;,而让&q;循环是无限循环?

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

写入引用会更新基础值,但引用会打印意外的值

使用 select 处理 SIGINT 和子等待!无阻塞

随机函数不返回随机值

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

如何在 Rust 中将函数项变成函数指针

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

如何为整数切片定义一个带有额外函数的特性别名?

枚举的利基优化如何在 Rust 中工作?

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

rust tokio::spawn 在 mutexguard 之后等待

将 `&T` 转换为新类型 `&N`

判断 is_ok 后重用结果

为什么拥有 i32 所有权的函数需要它是可变的?

在 FFI 的上下文中,未初始化是什么意思?

如何创建动态创建值并向它们返回borrow 的工厂?

如何将 while 循环内的用户输入添加到 Rust 中的向量?