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