4 个版本 (2 个重大更新)
0.3.0 | 2023年1月17日 |
---|---|
0.2.1 | 2023年1月14日 |
0.2.0 | 2023年1月13日 |
0.1.1 | 2023年1月11日 |
0.1.0 |
|
#16 in #replay
85KB
2K SLoC
rust-bsor
BS Open Replay Rust 解析器
免责声明:这是一个 Rust 学习项目,所以可能存在错误和非惯用代码
已知限制
当前版本不支持由非常旧的 Beat Leader 模组保存的、不符合 BL Open Replays 规范的回放(错误的 utf8 字符串编码)。已添加针对此边缘情况的失败测试(目前忽略),可能在 0.4.0 版本中实现。
安装
在您的项目目录中运行以下 Cargo 命令
cargo add bsor
或添加以下行到您的 [dependencies]
部分 Cargo.toml
bsor = "0.3"
用法
将整个回放加载到内存中
use bsor::prelude::*;
use std::fs::File;
use std::io::BufReader;
fn main() {
let mut br = BufReader::new(File::open("example.bsor").unwrap());
let replay = Replay::load(&mut br).unwrap();
println!("{:#?}", replay);
}
由于您可能很少需要完整的回放结构(尤其是帧块),同时希望保持内存使用量低,还可以选择仅加载选定的块(请注意,标题和信息块始终加载)。
注意:与需要任何 Read
读取器作为参数的 Replay::load()
不同,ParsedReplay::parse()
需要 Read + Seek
读取器
use bsor::prelude::*;
use std::fs::File;
use std::io::BufReader;
fn main() {
let mut br = BufReader::new(File::open("example.bsor").unwrap());
let replay_index = ReplayIndex::index(br).unwrap();
let notes = replay_index.notes.load(br).unwrap();
println!(
"Info: {:#?}\nNotes count: {:#?}",
replay_index.info,
notes.len()
);
if !notes.is_empty() {
let notes_count = notes.len();
let idx = notes_count / 2;
println!(
"Note[{}] = {:#?}",
idx, notes[idx]
);
} else {
println!("Replay contains no notes 🤔");
}
}
内存节省可能非常显著,例如,对于平均大小的 1375kB 回放
块 | 内存使用 |
---|---|
整个回放 | 1383kB |
标题 + 信息 | 9kB |
帧 | 1255kB |
注意 | 137kB |
测试
该软件包根据 BL Open Replay 规范进行了全面测试,但请注意,实际的回放可能与其略有不同,例如,BL 模块的较旧版本错误地编码了 utf8 字符串。如果您遇到软件包无法读取的回放,请在 GitHub 问题 中报告,并提供链接。