Rust如何将struct转换回C?
我正在构建一个服务器客户端应用程序,在这个应用程序中,服务器正在运行,获取给定路径的统计信息并将其传输到C客户端。我希望C客户机能够直接使用字节,并将其转换为结构。我所说的统计数据是C。以下是我对统计数据的表示:Rust如何将struct转换回C?,c,rust,C,Rust,我正在构建一个服务器客户端应用程序,在这个应用程序中,服务器正在运行,获取给定路径的统计信息并将其传输到C客户端。我希望C客户机能够直接使用字节,并将其转换为结构。我所说的统计数据是C。以下是我对统计数据的表示: #[repr(C)] pub struct Stat { st_dev: u64, st_ino: u64, st_nlink: u64, st_mode: u32, st_uid: u32, st_gid: u32, st_rd
#[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()
}
}
}
有人知道是什么导致了这个问题吗?我如何解决它呢?使用nix。看
nix使用
libc
包中的struct stat
,该包为每个受支持的平台提供单独的手动生成的结构定义。我不太明白为什么要对stat结构进行编码,但需要记住,它们很可能在不同的体系结构、平台和操作系统版本之间互不兼容。也就是说,只有当编码器和解码器在同一平台的同一版本上运行时,您才能可靠地按字节编码和解码它们。从您的链接:注意:stat结构中字段的顺序在不同的体系结构中有所不同。此外,上面的定义没有显示不同体系结构中某些字段之间可能存在的填充字节。如果需要了解详细信息,请参阅glibc和内核源代码因此,如果我将libc stat转换为字节并从C端转换,它实际上可以正确地处理这种情况?有趣的是,我一定会尝试一下!谢谢您需要确保服务器和客户端操作系统之间的不兼容不会成为您用例中的问题。stat结构很可能在不同的应用程序之间不兼容它的结构。
# 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