gpt4 book ai didi

rust - 如何使用 serde 和 bincode 映射填充超过 32 字节的 C 结构?

转载 作者:行者123 更新时间:2023-11-29 07:55:57 37 4
gpt4 key购买 nike

我正在使用 serde 和 bincode 映射二进制结构。

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate bincode;

#[derive(Serialize, Deserialize)]
struct Superblock {
magic: [u8; 16],
//reserved: [u8; 492],
crc: u32,
}

事情按预期进行,但我无法映射保留字段。显然,固定大小的数组仅针对最大 32 字节的大小定义。

如何注册自定义大小的数组,以便对填充进行反序列化?

serde+bincode 是正确的方法吗?我需要控制字节顺序(由 bincode 提供)并且我喜欢声明式风格。

最佳答案

serde_derive 支持 field attributes #[serde(serialize_with="func")], #[serde(deserialize_with="func")]#[serde(with="module")],它允许提供自定义序列化/反序列化例程:

#[derive(Serialize, Deserialize)]
struct Superblock {
magic: [u8; 16],
#[serde(with="array_492")] // <--
reserved: [u8; 492],
crc: u32,
}

mod array_492 {
use serde::*;

pub fn serialize<S, T>(array: &[T; 492], ser: S) -> Result<S::Ok, S::Error>
where S: Serializer, T: Serialize
{
unimplemented!() // fill in yourself.
}

pub fn deserialize<'de, D, T>(de: D) -> Result<[T; 492], D::Error> {
where D: Deserializer<'de>, T: Deserialize<'de>
{
unimplemented!() // fill in yourself.
}
}

有关实际实现,请参阅此要点:https://gist.github.com/kennytm/21403667b5a17172cfcd11f9df9365e2 .请注意,这针对一次反序列化整个字节数组进行了优化。

关于rust - 如何使用 serde 和 bincode 映射填充超过 32 字节的 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44468386/

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