[英]How to deserialize a C struct into a Rust struct
假設在 C 中存在這樣的內核頭文件:
typedef struct {
uint32_t type;
uint32_t length;
uint32_t extra;
uint32_t flags;
uint32_t reserved0;
uint32_t reserved1;
uint32_t magic;
uint32_t crc32;
} zbi_header_t;
也就是說,內核映像的第一個字節就是這個結構體。
為了將這個頭文件解析成 Rust,我有這樣的事情:
#[derive(Debug)]
#[repr(C)]
pub struct ZbiHeader {
zbi_type: u32,
length: u32,
extra: u32,
flags: u32,
reserved0: u32,
reserved1: u32,
magic: u32,
crc32: u32,
}
請注意,我添加了一個repr(C)
。
將大小為sizeof(zbi_header_t)
的切片&[u8]
轉換為該結構的最佳 Rust 方法是什么?
我可以獲取一個字節數組並將其反序列化為一個結構體嗎? 談論對齊問題,但我們會在這里嗎?
在這種所有值都是 uint32_t 的特殊情況下,我認為編譯器不會做任何填充,但我不知道這是否有保證,而且我正在考慮如果中間有一個 u8 會怎樣。 可能是編譯器總是禁用此文件的填充? 順便說一句,標題來自https://fuchsia.googlesource.com/fuchsia/+/6d0df1b8f7cbadf04553501f995156b224dd6347/zircon/system/public/zircon/boot/image.h#102但我找不到任何說它應該的規則忽略填充等。
填充不會成為問題 - 因為你有#[repr(C)]
,Rust ZbiHeader
的表示將匹配 C zbi_header_t
,填充和所有的表示。
至於對齊問題,這完全取決於您如何獲得&[u8]
字節切片。 如果您知道這是一個zbi_header_t
為字節指針的zbi_header_t
的事實,那么該指針應該是對齊的。 如果您只是從文件輸入緩沖區中獲取一個隨機的&[u8]
切片,那么您就不得不擔心了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.