因此,我们有一个ppmd解压缩代码,该代码是从Dmitry Shkarin的1997年原始代码中剪切和粘贴的(基于其中的一些注释)。代码本身几乎没有注释,而我只是找不到它是如何工作的。 该代码使用了一个子分配器,但它不仅分配或取消分配子分配器,还以我尚无法理解的各种方式直接从调用代码中操纵空闲块列表。
我们发现了一个模糊的示例,该示例导致代码崩溃,我被分配对其进行修复。
但是为了解决这个问题,我需要了解减压的工作原理(仅对减压感兴趣)。
Google也不是很有帮助。搜索结果以昵称相同的游戏者的结果或各种存档者的功能列表为主导。我最终找到了一个俄语网站,该网站只能通过Wayback机和俄语找到算法规范,由于语言障碍,我无法阅读。
但是看起来这只是一个数学描述。到目前为止,我对有关PPMD压缩数据如何在压缩文件中进行布局或在解压缩时如何使用的规范一无所知。
任何了解PPMD算法的人都可以给我一些指导吗?
理想情况下,我正在寻找解释PPMd编码数据结构的文档。有关deflate的详细信息,类似于RFC1951。
更新:
结果证明代码中有很多令人讨厌的东西。
例如这一个:
MaxContext=FoundState->Successor; return;
}
*pText++ = FSymbol; Successor = (PPM_CONTEXT*) pText;
if (pText >= UnitsStart) goto RESTART_MODEL;
if ( FSuccessor ) {
if ((BYTE*) FSuccessor < UnitsStart)
它将内容写入字节缓冲区,然后将其强制转换为包含指针的结构。
然后在CreateSuccessors函数中,我们还有另一种法术。
ct.oneState().Successor=(PPM_CONTEXT*) (((BYTE*) UpBranch)+1);
UpBranch
和ct.oneState().Successor
是PPM_CONTEXT指针。我无法想象这样的声明的目的是什么。正如我所说的,此结构包含最终可以取消引用的指针(我尝试将这些指针设置为NULL以确定是否使用了它们)。事实证明,它们确实已被取消引用! (至少在第二种情况下)。