龙之谷-技术资料-第14讲PAK文件解析

由于肾大开启投票选择关闭PAK文件或放弃PAK文件,无论玩家做何选择,显然PAK文件已经可以被广大玩家所认识,故在此向大家介绍一下PAK文件。

PAK文件是一种较为简单的压缩文件,通常采用头部描述+中段压缩数据+尾部文件信息组成,压缩算法大多选用通用的算法,以解压速度为先,尾部文件信息含有ASCII文本的文件相对路径。

DN中的PAK文件属于EYE自定义的格式,其文件结构为:
[头部]
总计1024字节
头部结构:
char szID[256];//文件ID, 占256字节
DWORD dwVer;//版本或识别码, 占4字节
DWORD dwRecordNum;//包内文件总数, 占4字节
DWORD dwRecordOffset;//第一个尾部文件信息块的偏移, 占4字节
BYTE dbReserved[756];//保留, 占756字节
[中段]
压缩数据,以78 01开始,属于典型的zlib普通压缩(一种开源的算法)
[尾部]
每个文件信息占316字节,故总字节数=316×文件总数
文件信息块结构:
char szFilename[256];//文件相对路径, 占256字节,ASCII文本,CodePage=949
DWORD dwPackedSize;//压缩后大小, 占4字节
DWORD dwTrueSize;//实际大小, 占4字节
DWORD dwOccupationSize;//在包文件内占据的大小, 占4字节
DWORD dwOffset;//在包文件内偏移, 占4字节
DWORD dwFlag;//标记, 占4字节
BYTE dbReserved[40];//保留, 占40字节

PAK文件解压方法简介:
1.打开文件,读取文件头,获得文件总数和一个尾部文件信息块的偏移
2.定位文件指针到尾部文件信息块,分配内存,从文件读取全部的文件信息块
3.对文件信息块按[在包文件内偏移]进行排序(可选,目的是为了加快解压速度)
4.循环处理所有的文件信息块
4.1 定位文件指针到[在包文件内偏移]
4.2 分配内存,字节数为[压缩后大小],从文件读取压缩数据块
4.3 分配内存,字节数为[实际大小],调用zlib解压缩函数进行解压
4.4 从[文件相对路径]中获取目录名,递归创建完整的目录
4.5 根据[文件相对路径]创建新文件,将解压数据保存到改文件

PAK文件创建方法简介:
1.遍历选定路径下所有的文件,提取文件相对路径和文件实际大小
2.创建PAK文件,写入头部块,包内文件总数和第一个尾部文件信息块的偏移暂时不填
3.读取每一个待压缩文件,调用zlib压缩函数进行压缩(采用普通压缩)
4.将压缩后的数据保存到PAK文件,同时跟新文件信息块的内容
5.压缩数据完成后,把文件总数和当前位置更新到头部块,然后将所有的文件信息块保存到PAK文件
7.定位PAK文件指针到头部,再次写入头部块,保存并关闭

© 版权声明
THE END
文章不错?点个赞呗
点赞0 分享