簡體   English   中英

Rust 如何將 struct 傳輸回 C?

[英]How can Rust transfer struct back to C?

我正在構建一個服務器客戶端應用程序,其中服務器是 Rust 並獲取給定路徑的統計信息並將其傳輸到 C 客戶端。 我希望 C 客戶端能夠直接使用字節,並將其轉換為結構。 我正在談論的 stat 是 C 中的這個結構體。這是我對 stat 的 Rust 表示:

#[repr(C)]
pub struct Stat {
    st_dev: u64,
    st_ino: u64,
    st_nlink: u64,
    st_mode: u32,
    st_uid: u32,
    st_gid: u32,
    st_rdev: u64,
    st_size: u64,
    st_blksize: u64,
    st_blocks: u64,
    st_atime: i64,
    st_atime_nsec: i64,
    st_mtime: i64,
    st_mtime_nsec: i64,
    st_ctime: i64,
    st_ctime_nsec: i64
}

impl Stat {
    pub fn encode(self) -> Vec<u8> {
        unsafe {
            std::slice::from_raw_parts(
                (&self as *const Stat) as *const u8,
                std::mem::size_of::<Stat>()
            ).to_owned()
        }
    }
}

但是,當我從 C 端收到值后發現值不匹配時。 下面是按照結構體中的順序對每個字段的值進行比較,

# C:
16777220
8613988721
0
0
5
0
16832
6879832142633762816
0
1327895242430480384
20
687194767360
17592186044416
0
6879832142633762816
0

#Rust:
16777220
8613988721
5
16832
501
20
0
160
4096
0
1601835746
0
1601835746
0
1601835746
309174704

有誰知道是什么導致了這個問題? 我該如何解決?

使用尼克斯。 https://docs.rs/nix/newest/nix/sys/stat/fn.stat.html

nix 使用libc包中的struct stat ,它為每個支持的平台都有一個單獨的手動生成的 struct 定義。 我不完全理解您為什么要對統計結構進行編碼,但您需要記住,它們很可能在不同的體系結構、平台和操作系統版本之間相互不兼容。 也就是說,只有當編碼器和解碼器運行在同一平台的同一版本上時,您才能可靠地對它們進行字節編碼和解碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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