zrckr/xcompress
GitHub: zrckr/xcompress
该项目逆向实现了 Microsoft Xbox LZX 压缩编解码器 xcompress 动态库,提供完整的解压与压缩功能及测试套件。
Stars: 0 | Forks: 0
# xcompress
`xcompress` 动态库的逆向工程项目 - 一款 Microsoft
Xbox LZX 压缩编解码器。
## 状态
解压缩和压缩均已完成反编译和实现。
## 字节匹配行为
来自 FEZ 1.12 (`Other.pak`) 的 XNB 资产被用作测试样本,并使用
[FEZRepacker](https://github.com/FEZModding/FEZRepacker) 1.3.0 进行了提取。文件成对进行测试 -
即压缩版本和未压缩版本。
| 测试 | 结果 | 差异 |
| ---------------------- | --------- | ---- |
| 解压缩 | 2028/2028 | 0 |
| 压缩 | 1816/2028 | 212 |
| 压缩 -> 解压缩 | 2028/2028 | 0 |
| 解压缩 -> 压缩 | 1816/2028 | 212 |
## 压缩问题
尽管代码能够对原始数据以及由 `xcompress` 解压版生成的数据进行解压,
但压缩字节的写入方式存在差异。该编码器在功能上是正确的 -
往返解压缩始终成功 - 但其输出与原始库的输出并不完全按字节一致。
## 测试套件
### 参数
```
--compressed Path to compressed XNB file(s)
--decompressed Path to uncompressed XNB file(s)
--verbose, -v Print detailed mismatch info (byte diffs, chunk analysis)
--output-failed-compressed Save failed compression attempts as .fail files
```
### 构建
使用 Visual Studio 构建 `xcompress` DLL(解决方案:`xcompress.sln`)。
构建后步骤会自动将 `xcompress.dll` 复制到
`testsuite/bin//net10.0/`。然后运行测试套件:
```
dotnet run --project testsuite -- --compressed --decompressed
```
## 实现细节
**编解码器**:LZX (Lempel-Ziv-X)
**测试套件使用的参数:**
| 参数 | 值 |
| ------------------------- | ------ |
| 窗口大小 | 64 KB |
| 压缩分区大小 | 256 KB |
| 块大小 | 32 KB |
**每个块的 Huffman 树:**
- 主树 - 256 个字面量 + 位置槽
- 长度树 - 249 个符号
- 对齐偏移树 - 8 个符号
**块类型:**
1. Verbatim - Huffman 编码的字面量和匹配
2. Aligned - Huffman + 对齐偏移编码
3. 未压缩 - 针对不可压缩数据进行原样存储
**其他特性:**重复匹配偏移缓存(3 个槽位),E8 转换(x86
预处理),通过二叉搜索树进行滑动窗口模式匹配。
## 许可证
参见 `LICENSE.txt`。
标签:UML, 云资产清单, 多人体追踪, 数据压缩, 游戏开发, 算法实现, 编解码库, 逆向工程