繁体   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