我对 Rust 相当陌生,并且在我的项目中使用 bincode。枚举变体的编码是我在与现有服务器交互时一直试图处理的一个问题。旧项目是用 C 语言编写的,并定义了“fshort-enums”的编译器选项。
在旧的 C 项目中,我会定义一个类似的枚举:
enum test_enum {
Start,
Init,
Complete,
}
然后当这个数据被放入数据包时,它将占用 1 个字节,如下所示:
0x00,
0x01,
0x02
如果我将枚举定义为:
enum test_enum {
Start,
Init,
Complete = 65535,
}
然后当这个数据被放入数据包时,每个变体都会占用 2 个字节,如下所示:
0x00 0x00,
0x01 0x00,
0x02 0x00
现在我找到了一种方法来配置bincode
枚举编码以从默认的 4 个字节更改为适合以下值的大小:
#[derive(Serialize, Deserialize)]
enum TestEnum {
Start,
Init,
Complete = 65535,
}
let x = TestEnum::Complete;
if let Ok(bytes) = bincode::options().with_varint_encoding().serialize(&x) {
println!("{:?}", bytes); // [2]
}
问题1:如何强制bincode
使所有变体占用2个字节?
问题2:如何强制bincode
应用枚举变量值?(在此示例TestEnum::Complete
中,值为 2 而不是 65535)。