5次发布
0.1.4 | 2024年4月26日 |
---|---|
0.1.3 | 2024年2月13日 |
0.1.2 | 2024年2月13日 |
0.1.1 | 2024年2月13日 |
0.1.0 | 2024年2月13日 |
#471 in 压缩
27 每月下载
在 cgn-cli 中使用
250KB
2K SLoC
CGN (Compressed Game Notation)
本库提供了一套压缩算法,用于压缩PGN (Portable Game Notation) 数据。该库还提供了一套数据结构,用于以缩减格式存储PGN数据。
压缩算法(从高到低压缩率 —— 从低到高速度)
opening-huffman
- 使用huffman-encoding crate进行压缩的Huffman编码算法,但针对常见开局移动进行了额外优化。dynamic-huffman
- 使用huffman-encoding crate进行压缩的Huffman编码算法,具有动态更新的huffman树。huffman
- 使用huffman-encoding crate进行压缩的Huffman编码算法。bincode
- 使用bincode crate进行序列化的简单二进制编码算法。
数据结构
PgnData
- 一个结构体,用于保存PGN游戏的头和走法。仅存储PGN '缩减导出格式'所需的数据。PgnHeaders
- 一个结构体,用于保存PGN游戏的头。仅存储PGN '缩减导出格式'所需的数据。SanPlusWrapper
- 一个包装结构体,用于保存一个SanPlus
结构体。用于在SanPlus
结构体上实现序列化和反序列化特性。
示例用法
use cgn::pgn_data::PgnData;
use cgn::compression::dynamic_huffman::{compress_pgn_data, decompress_pgn_data, dynamic_huffman_compress_pgn_str, dynamic_huffman_decompress_pgn_str};
use bit_vec::BitVec;
use std::str::FromStr;
const PGN_STR_EXAMPLE: &str = r#"[Event "Titled Tuesday Blitz January 03 Early 2023"]
[Site ""]
[Date "2023.01.03"]
[Round "?"]
[White "Magnus Carlsen"]
[Black "Samvel Ter-Sahakyan"]
[Result "1-0"]
1. a4 Nf6 2. d4 d5 3. Nf3 Bf5 4. Nh4 Be4 5. f3 Bg6 6. Nc3 c5 7. e4 cxd4 8. Nxg6
hxg6 9. Qxd4 Nc6 10. Qf2 d4 11. Nd1 e5 12. Bc4 Rc8 13. Qe2 Bb4+ 14. Kf1 Na5 15.
Bd3 O-O 16. Nf2 Qb6 17. h4 Nh5 18. Rh3 Qf6 19. g4 Nf4 20. Bxf4 Qxf4 21. h5 g5
22. Rd1 a6 23. Kg2 Rc7 24. Rhh1 Rfc8 25. Nh3 Qf6 26. Ra1 Nc6 27. Rhc1 Bd6 28.
Qd2 Bb4 29. c3 Be7 30. Nf2 dxc3 31. bxc3 Nd8 32. Bb1 Ne6 33. Nh3 Bc5 34. Ba2 Rd8
35. Qe2 Nf4+ 36. Nxf4 gxf4 37. Kh3 g6 38. Rd1 Rcd7 39. Rxd7 Rxd7 40. Rd1 Bf2 41.
Bxf7+ Kf8 42. Qxf2 Rxd1 43. Bxg6 Qd6 44. g5 Qd3 45. Qc5+ Qd6 46. Qc8+ Kg7 47.
Qxb7+ Kf8 48. Qf7# 1-0"#;
// PgnData Struct to BitVec Example
let pgn_data: PgnData = PgnData::from_str(PGN_STR_EXAMPLE).unwrap();
let compressed_bitvec: BitVec = compress_pgn_data(&pgn_data).unwrap();
let decompressed_pgn_data: PgnData = decompress_pgn_data(&compressed_bitvec).unwrap();
assert_eq!(pgn_data, decompressed_pgn_data);
// Pgn String to Bytes Example (functions are suitable for WASM compilation)
let compressed_bytes: Vec<u8> = dynamic_huffman_compress_pgn_str(PGN_STR_EXAMPLE);
let decompressed_pgn_str: String = dynamic_huffman_decompress_pgn_str(&compressed_bytes);
assert_eq!(PGN_STR_EXAMPLE, decompressed_pgn_str);
依赖项
~6.5MB
~102K SLoC