我正在从套接字读取一系列字节,我需要将每个长度为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)?
x
也是u16
,则不需要填充。如果x
仍然是u8
,并且在x
和y
之间有一个x2
字段,该字段也是u8
,则仍然不需要填充。你明白为什么吗?(请注意,无论语言如何,您都可以查找结构体对齐方式 - 原因始终相同。) - Theodoros Chatzigiannakisu8
并不会更快。原因是u8
的对齐方式是8位,而u16
的对齐方式是16位。这样就在它们之间创建了必要的8位空间。您可以选择自己使用这个空间(通过将第一个字段扩展到16位或引入一个中间的8位字段),也可以将其保留未使用(称为填充),但无论哪种方式,编译器都将把8位空间放在那里,无论您是否打算将其命名为字段。(除非您明确要求打包结构体,如答案中所述。) - Theodoros Chatzigiannakis