FF7 LZSS压缩中raw_offset与real_offset物理含义及相关技术问题
FF7 LZSS压缩实现相关问题
偏移量计算与raw_offset含义困惑
我在为某手游的.lzs文件编写压缩/解压缩代码时,接触到Final Fantasy 7(FF7)的LZSS压缩实现,目前能完成解压缩,但对偏移量逻辑存疑:
- 该实现的长度/偏移对采用12位偏移量,计算公式为:
real_offset = tail - ((tail - 18 - raw_offset) mod 4096),其中tail是解压缩输出的当前位置,raw_offset由对中第二个字节的前4位加第一个字节的全部8位组成。 - 常规LZSS的偏移量是当前位置到重复模式起始位置的反向距离(比如字符串
ABCDEFABCGHIJ会被压缩为ABCDEF(6,3)GHIJ,6就是偏移量),但FF7的raw_offset物理含义完全搞不懂,甚至曾出现写入仅12字节时,real_offset达到3602导致IndexOutOfBounds错误的情况。
FF7 LZSS格式测试文件需求
现有的.lzs文件并非来自FF7,无法确认是否匹配该实现,需要获取采用该FF7 LZSS格式的测试文件。
文件末尾控制字节的处理疑问
当文件末尾的控制字节8位无法被剩余字节满足时,该如何处理?比如最后一个控制字节为0x00,意味着需要后续16字节(8个长度/偏移对),但实际仅剩余2字节,这种情况下是:
- 输出1个对后补14个
0x00? - 补7个
0x00? - 还是仅输出该对?
内容的提问来源于stack exchange,提问作者Rikudou
相关产品推荐
相关产品推荐

