gpt4 book ai didi

c - Rust如何将结构转移回C?

转载 作者:行者123 更新时间:2023-12-03 11:36:55 24 4
gpt4 key购买 nike

我正在构建一个服务器客户端应用程序,其中服务器是Rust,并获取给定路径的统计信息并将其传输到C客户端。我希望C客户端能够直接使用字节,并将其转换为结构。我正在谈论的统计信息是C语言中的this struct。这是我对统计信息的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
有谁知道是什么引起了这个问题?我该如何解决呢?

最佳答案

使用nix。参见https://docs.rs/nix/newest/nix/sys/stat/fn.stat.html
nix使用struct stat包中的libc,它为每个受支持的平台提供了一个单独的手动生成的结构定义。我不确定您为什么要对统计结构进行编码,但是您需要记住,在不同的体系结构,平台和操作系统版本之间,它们很可能是相互不兼容的。也就是说,只有当编码器和解码器在同一平台的相同版本上运行时,才可以可靠地对它们进行字节编码和解码。

关于c - Rust如何将结构转移回C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64199892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com