2个不稳定版本
0.2.0 | 2024年1月7日 |
---|---|
0.1.0 | 2023年8月16日 |
#1051 在 数据结构
每月 29 次下载
用于 cdragon
105KB
2K SLoC
CDragon库用于BIN文件
用于处理《英雄联盟》使用的BIN文件的库。
lib.rs
:
支持Riot PROP文件
概述
PROP文件,通常称为bin文件,包含嵌套数据结构。所有结构都是类型化的,并且通常遵循相同的类型,但类型由数据本身提供,因此不需要模式来解码。
每个PROP文件包含一个条目列表,其中每个条目本身包含各种字段的嵌套列表,字段类型各异。
动态类型
容器类型存储其类型是动态定义的数据。由于Rust类型是静态定义的,因此不能直接使用。此外,即使容器在运行时知道嵌入的bin类型,Rust类型系统也要求用户明确请求特定的类型。
宏 [binget!()
] 使得链式转换变得更容易,当预先知道要获取的名称和类型时应该足够。
也可以显式地转换数据,使用所有包装动态类型的数据类型提供的 downcast()
方法。
field.downcast::<BinString>();
// => `Some(BinString)` if field contains a string, `None` otherwise
具有字段的容器提供 getv()
辅助函数来跟随 get()
并使用 downcast()
。
如果必须处理所有可能类型,可以使用 [binvalue_map_type!()
] 提供一个处理所有可能类型的单个泛型表达式。
映射键只支持类型子集。[binvalue_map_keytype!()
] 可以用于仅映射键类型。它可以与另一个 [binvalue_map_type!()
] 结合起来处理键和值。
注意:这些宏被扩展为处理所有可能情况的 match
,结果代码可能很大。
示例
binvalue_map_type!(field.vtype, T, {
let value: &T = field.downcast::<T>().unwrap();
});
binvalue_map_keytype!(map.ktype, K,
binvalue_map_type!(map.vtype, V, {
let entries: &Vec<(K, V)> = map.downcast::<K, V>().unwrap();
})
);
Bin散列
二进制文件使用32位FNV-1a哈希算法为多个标识符名称生成哈希值
哈希值可以在编译时通过 [cdragon_hashes::binh!()
](https://docs.rs/cdragon-prop/latest/cdragon_prop/?search=cdragon_hashes%3A%3Abin) 计算出来,或者使用来自cdragon_hashes::bin
的其他方法。
BinHashMappers
收集了二进制数据所需的全部哈希值到字符串的转换。
依赖
~1.3–2MB
~40K SLoC