gpt4 book ai didi

rust - 我可以获取字节数组并将其反序列化为结构吗?

转载 作者:行者123 更新时间:2023-11-29 08:33:33 25 4
gpt4 key购买 nike

我正在从套接字读取一系列字节,我需要将 n 个字节的每个段作为结构中的一个项目。

use std::mem;

#[derive(Debug)]
struct Things {
x: u8,
y: u16,
}

fn main() {
let array = [22 as u8, 76 as u8, 34 as u8];
let foobar: Things;
unsafe {
foobar = mem::transmute::<[u8; 3], Things>(array);
}

println!("{:?}", foobar);

}

我得到的错误提示是 foobar 是 32 位,而 array 是 24 位。 foobar 不应该是 24 位 (8 + 16 = 24) 吗?

最佳答案

这里的问题是 y 字段是 16 位对齐的。所以你的内存布局其实是

x
padding
y
y

请注意,交换 xy 的顺序没有帮助,因为 Rust 的结构内存布局实际上是未定义的(因此无缘无故仍然是 32 位但编译器中的简单性)。如果你依赖它,你会得到未定义的行为。

对齐的原因在 Purpose of memory alignment 中有解释。 .

您可以通过将属性 repr(packed) 添加到您的结构中来防止对齐发生,但是您将失去性能和获取字段引用的能力:

#[repr(packed)]
struct Things {
x: u8,
y: u16,
}

最好的方法是根本不使用transmute,而是手动提取值并希望优化器使其更快:

let foobar = Things {
x: array[0],
y: ((array[1] as u16) << 8) | (array[2] as u16),
};

byteorder 这样的 crate 可以简化从字节读取不同大小和字节顺序的过程。

关于rust - 我可以获取字节数组并将其反序列化为结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com