2个不稳定版本

0.2.0 2024年1月7日
0.1.0 2023年8月16日

#1051数据结构

每月 29 次下载
用于 cdragon

MIT/Apache

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