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, 云资产清单, 多人体追踪, 数据压缩, 游戏开发, 算法实现, 编解码库, 逆向工程