#ddnet #parser #chunks #header #file #th #memory

teehistorian

DDNet的teehistorian解析器

16个版本

0.10.2 2024年7月18日
0.10.0 2024年4月18日
0.9.0 2023年8月24日
0.8.3 2023年6月15日
0.3.2 2021年3月15日

#755 in 编码

Download history 70/week @ 2024-04-19 111/week @ 2024-07-12 81/week @ 2024-07-19 6/week @ 2024-07-26

198 每月下载量
6 个crate(2 个直接) 中使用

LGPL-3.0

88KB
2.5K SLoC

DDNet的teehistorian解析器

这个crate提供了一个库,用于安全解析游戏 DDNet 中的 teehistorian 文件。这个库的目标是

  • 性能
    • 可以通过不加载整个文件来检索头部
    • teehistorian文件不需要全部适合内存
  • 提供一个C-API,以便最终将其集成到 DDNet 中的teehistorian重放器

在这个库的非常核心部分是 Th 结构,用于获取teehistorian文件的 Chunks

示例

直接将teehistorian文件加载到内存中

use teehistorian::{Chunk, Th};
let input = b"\x69\x9d\xb1\x7b\x8e\xfb\x34\xff\xb1\xd8\xda\x6f\x60\xc1\x5d\xd1\
           {\"version\":\"2\"}\x00\
           \x40";
let mut th = Th::parse(&input[..]).unwrap();
assert_eq!(th.header().unwrap(), br#"{"version":"2"}"#);
assert_eq!(th.next_chunk().unwrap(), Chunk::Eos);
assert!(th.next_chunk().unwrap_err().is_eof());

当操作文件时

use teehistorian::{Chunk, ThBufReader, Th};
use std::fs::File;

let f = File::open("tests/minimal.teehistorian").unwrap();
let mut th = Th::parse(ThBufReader::new(f)).unwrap();
assert_eq!(th.header().unwrap(), br#"{"version":"2"}"#);
assert_eq!(th.next_chunk().unwrap(), Chunk::Eos);
assert!(th.next_chunk().unwrap_err().is_eof());

依赖项

~1.5–2.3MB
~47K SLoC