簡體   English   中英

如何將 C 結構反序列化為 Rust 結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM