如何在Rust中设置一个子数组。

4

我还不太熟悉Rust,如果问题有点基础请见谅,但我找不到任何好的资源。我正在编写一些IPC代码,以下是我的片段:

// Header format           | "magic string"          | msg len   | msg type id |
let mut header: [u8; 14] = [105, 51, 45, 105, 112, 99, 0, 0, 0, 0, 0, 0, 0, 0];

我希望将header [10..14]设置为一个32位消息类型的本机字节顺序编码。同时,我还想将header[6..10]设置为消息长度(再次使用本机字节顺序的32位整数)。
到目前为止,我尝试过:
使用切片:(找不到编译的形式)
header[10 .. 14] = msg_type.to_ne_bytes();

一些奇怪的数组设计(无法找到编译通过的形式)

[header[10], header[11], header[12], header[13]] = msg_type.to_ne_bytes();

保存结果并覆盖写入。虽然可行,但似乎不够优雅。如果这是正确的答案,我理解,只是感觉不对。
let res = msg_type.to_ne_bytes();
header[10] = res[0];
header[11] = res[1];
header[12] = res[2];
header[13] = res[3];

如果有办法在创建数组时实现这一点,我很乐意尝试。提前感谢!

附言:如果有人好奇的话,这是 swaywm ipc 消息的客户端。

1个回答

4

使用切片是一个好方法。它是数组,所以您可以在数组上使用所有的切片方法。

我们将您的示例 header[10 .. 14] = msg_type.to_ne_bytes(); 转换为下面的代码,这个也可以运行:

header[10..14].copy_from_slice(&msg_type.to_ne_bytes());

请注意,在 a.copy_from_slice(b) 中,您需要确保 a 和 b 具有相同的长度,否则该方法调用将引发恐慌。
(另一种类似的替代方法是使用 byteorder crate。)

太好了,非常感谢!我甚至打开了 Rust 的切片文档,但从未想过查看方法。哈哈 - Carson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接