DEFLATE压缩结果不一致:游戏生成与Python zlib.deflate输出差异求解
核心差异
两份压缩数据虽然解压结果一致,但有两个核心区别直接导致游戏不兼容:
- zlib封装头参数不同:第一份游戏生成的压缩数据头为
0x78 0x5E,对应zlib最快压缩等级(等级1);Python zlib默认生成的头为0x78 0x9C,对应默认压缩等级(等级6)。MMF2引擎自带的deflate解压器会校验头字节的压缩等级标识,不符合要求会直接终止解析。 - 内部压缩块编码结构不同:不同压缩等级下,deflate算法生成的霍夫曼编码表、数据块拆分逻辑完全不同。该游戏的Lua层关卡解析逻辑做了简化实现,仅能兼容等级1生成的块结构,无法识别更高压缩等级的编码块,触发内存溢出导致崩溃。
修复方案
调整Python zlib的压缩参数,强制使用等级1压缩即可:
- 常规zlib封装格式(和游戏原生格式一致)的调用方式:
import zlib # raw_data为你生成的18x18扁平化数组字节流 compressed_data = zlib.compress(raw_data, level=1)
- 如果游戏要求使用无zlib头/校验和的原始deflate流,改用以下调用方式:
import zlib compressor = zlib.compressobj(level=1, wbits=-15) compressed_data = compressor.compress(raw_data) + compressor.flush()
生成后可校验压缩数据的前两个字节是否为0x78 0x5E,和游戏原生格式对齐即可正常导入。
内容的提问来源于stack exchange,提问作者Heptor44
相关产品推荐
相关产品推荐

