在互联网的发展中,资源的整理一般成了发布软件应用的迫在眉睫的一件事情,不经打包的资源往往容易暴露而且众多的文件使得拷贝等待时间变长。在这种情况下,一种应用便诞生了,其起源是源自压缩软件,这便是我们今天要介绍的打包插件。

resources package

1、魔兽世界

2、天龙八部

\

3、剑侠情缘三

4、笑傲江湖

5、刀剑2OL

PAK SOURCE

PAK SIMPLE TUTORIALS

图例

pak 数据包简介

    1. 解释
      pak数据包一般用在资源打包加密上,也就是把许多文件塞入一个文件内并压缩与加密, 一般用于游戏资源和配置的打包发布,例如魔兽世界经典的mpq资源包。

    2. 分类

      • 普通数据包,这类数据包一般用在对应用的数据读取直接使用
      • 补丁数据包,这类数据包一般用在对应用的数据包需要更新时使用
    3. 基本结构

      文件标记 | 包头数据 | 文件数据 | 文件数据 ... (最基本的结构)
      文件标记 | 包头数据 | HASHKEY TABLE | BLOCK TABLE | 列表信息文件数据 | 属性信息文件数据 | 文件数据 ... (pak结构)

    4. 包头数据结构

      包头数据为固定的一个结构体,它存放了一些最基本的pak包的信息,如版本信息、文件大小、文件的类型等等。

    5. 文件数据结构 文件块位置数据 | 文件块数据 ...

    6. HASHKEY TABLE

      顾名思义,它的存放了文件的名称,用来定位文件块数据的索引。

    7. BLOCK TABLE

      文件块数据数组,通过文件块数据索引可以获得对应文件块数据的数据存储位置(pak文件)、压缩后的大小、未压缩的大小、状态标记。

    8. 列表信息文件数据

      不管是普通包还是补丁数据包都有该文件,并放在第一个文件位置,即紧跟在BLOCK TABLE之后, 主要存放了有关文件名的数据。

    9. 属性信息文件数据

      不管是普通包还是补丁数据包都有该文件,并放在第二个文件位置,紧跟在列表信息文件之后, 存放了文件的版本、标记、crc32数据、时间数据、md5数据。

    10. 文件块数据及位置 文件块数据位置是一位存放文件块数据位置的数组,文件块数据为文件数据的基本单位, 在pak中一个文件块数据的基本大小为4096字节即4K。

    11. 关于普通和补丁包的区别

      两者在大小上有明显的区别,因为普通包会将文件列表信息数据保持足够的大,所以会将该文件数据分配为一个大小为2M的空间, 而补丁文件则根据文件有多少则记多少的原则。

PAK SIMPLE

code.

#include "pak/interface.h"
#include "pak/file.h"
#include "pak/util.h"
#include "main.h" int32_t main(int32_t argc, char * argv[]) {
uint64_t result = ;
pak::archive_t *archive = pak::archivecreate("test.pak",
result,
0x10000,
PAK_TYPE_PATCH);
if (NULL == archive) return -;
pak::fileadd(archive,
"files\\filelist.txt",
"files\\filelist.txt",
PAK_FILE_ENCRYPTED | PAK_FILE_COMPRESS,
,
pak::kFileTypeData);
pak::fileadd(archive,
"files\\filelist.txt",
"files\\filelist.txt",
PAK_FILE_ENCRYPTED | PAK_FILE_COMPRESS | PAK_FILE_REPLACEEXISTING,
,
pak::kFileTypeData);
ERRORPRINTF("pak::fileadd end 1.file");
pak::fileadd(archive,
"files\\global.txt",
"2.file",
PAK_FILE_ENCRYPTED | PAK_FILE_COMPRESS,
,
pak::kFileTypeData);
ERRORPRINTF("pak::fileadd end 2.file");
pak::archive_t *clonearchive = archive->createclone(result);
pak::file_t *file = pak::fileopen(clonearchive, "files\\filelist.txt", result);
DEBUGPRINTF("result: %d", result);
if (!file) return -;
char *buffer = new char[ * ];
if (!buffer) return -;
memset(buffer, , * );
uint64_t readed, size;
size = pak::filesize(file);
ERRORPRINTF("size: %d", size);
pak::fileread(file, buffer, size, &readed);
DEBUGPRINTF("buffer: %s, readed: %d", buffer, readed);
pak::fileeof(file);
pak::fileclose(file);
archive->destoryclone(clonearchive);
pak::archiveclose(archive);
DEBUGPRINTF("1 archiveclose");
memset(buffer, , * );
archive = pak::archiveopen("test.pak", result, true);
DEBUGPRINTF("result: %d", result);
if (!archive) return -;
DEBUGPRINTF("archive not NULL");
file = pak::fileopen(archive, "files\\filelist.txt", result);
if (!file) return -;
pak::fileread(file, buffer, size, &readed);
DEBUGPRINTF("1 buffer: %s, readed: %d", buffer, readed);
pak::fileeof(file);
pak::fileclose(file);
pak::fileadd(archive,
"files\\task.txt",
"2.file",
PAK_FILE_ENCRYPTED | PAK_FILE_COMPRESS | PAK_FILE_REPLACEEXISTING,
,
pak::kFileTypeData);
file = pak::fileopen(archive, "2.file", result);
if (!file) return -;
size = pak::filesize(file);
pak::fileread(file, buffer, size, &readed);
DEBUGPRINTF("1 buffer: %s, readed: %d", buffer, readed);
pak::fileeof(file);
pak::fileclose(file);
pak::archiveclose(archive);
archive = pak::archiveopen("test.pak", result, true);
DEBUGPRINTF("result: %d", result);
if (!archive) return -;
DEBUGPRINTF("archive not NULL");
file = pak::fileopen(archive, "2.file", result);
if (!file) return -;
size = pak::filesize(file);
pak::fileread(file, buffer, size, &readed);
DEBUGPRINTF("1 buffer: %s, readed: %d", buffer, readed);
pak::fileclose(file);
pak::fileeof(file);
pak::archiveclose(archive);
#if __WINDOWS__
system("pause");
#endif
return ;
}

result.

1. windows

2. linux

源码说明

特别说明这部分源码来自与经典的魔兽世界mpq包算法以及KPM衍生而来,为了尊重原作者在源码中保留了大部分的英文注释。源码如代码中作者的注释一样还有一些奇怪和不足的地方,这些不足大家可以自行找相应的办法临时修复,如果你找到了彻底解决的方法而不吝啬可以联系我。鉴于这部分代码比较旧,在不触犯代码著作的前提下,改写了大部分的结构,同时支持多平台使用,不用担心64/32位使用产生的问题。

成员招募(长期有效)

如果你也对开源知识比较感兴趣,如果也对网络应用或者网络游戏感兴趣,如果你也对该框架感兴趣,你可以加入我们的QQ群(348477824)。

欢迎大家进群相互交流学习,同时也欢迎各位朋友对该框架供出自己的一份心力。

plain framework 1 pak插件说明(资源压缩加密)的更多相关文章

  1. plain framework 1 版本更新 1.0.2 增加打包插件

    由于个别因素,该框架的文档没有及时的更新到博客上,但是离线的文档已经完成.本次更新对框架来说显得比较重要,因为在文档的编写过程中经过再次的阅读代码修复了不少错误,最主要的是统一了整个框架的标准风格.对 ...

  2. plain framework 1 1.0.3更新 优化编译部分、网络压缩和加密

    有些东西总是姗姗来迟,就好比这新年的钟声,我们盼望着新年同时也不太旧的一年过去.每当这个时候,我们都会总结一下在过去的一年中我们收获了什么,再计划新的一年我们要实现什么.PF并不是一个十分优秀的框架, ...

  3. plain framework 商业版 开发总结2 项目管理器

    任何事情都有三个阶段,分析.制作.质检的过程.在程序中就分为设计.编码.调试(测试)三个阶段,其中设计最为重要,设计的不好会导致编码和调试重复,甚至最后又回到了设计的过程.为了不会重复返工,所以设计的 ...

  4. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  5. plain framework 1(简约框架)一款主要用于网络(游戏)开发的C/C++框架 即将开源发布

    在我们的日常开发中,我们往往会遇到这种情况,当我们换了一个开发环境时很可能会重新利用一套新的框架进行开发.由于不同框架有着不同的接口,所以我们不得不花时间再次熟悉这些接口,这将造成开发时间上的重复,而 ...

  6. duilib入门之贴图描述、类html文本描述、动态换肤、Dll插件、资源打包

    转载自duilib入门文档 贴图描述: Duilib的表现力丰富很大程度上得益于贴图描述的简单强大.Duilib的贴图描述分为简单模式和复杂模式两种. 简单模式使用文件名做为贴图描述内容,在这种方式下 ...

  7. plain framework 1 一款主要用于网络(游戏)开发的C/C++开源框架 安装篇 updated

    上次介绍了一下plain framework的基础相关资料,今天该框架正式开源发布.项目的地址托管于github上,我相信大多数朋友都应该知道.今天要介绍的是该框架的目录基本结构,以及分别在linux ...

  8. plain framework 1 1.0.4 更新 稳定版发布

    PF由于各种因素迟迟不能更新,此次更新主要是更新了以往和上个版本出现的内存问题,该版本较为稳定,如果有用到的朋友请更新至此版本. PF 1.0.4 修复1.0.0.3更新后产生的内存问题,可能导致网络 ...

  9. 程序设计模式浅析(plain framework商业版设计模式)

    程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...

随机推荐

  1. Squire – 简洁的 HTML5 富文本编辑器

    Squire 是一个简洁的 HTML5 富文本编辑器,它提供了强大的跨浏览器的标准化,超级轻巧灵活.它是建立在现在和未来并作为研究,因此并不支持那些古老的浏览器. 在线演示      源码下载 您可能 ...

  2. BeeFree - 在线轻松创建电子邮件消息

    Beefree 可以很容易地创建一个电子邮件消息,可以被用来发送企业简讯,宣布一个新产品,促进销售等.可以免费使用,您甚至不需要创建任何类型的帐户.您可以使用 Beefree 创建创新的,易于使用的电 ...

  3. 最简单的轮播广告(原生JS)

    改变每个图片的opacity属性:来自学友刘斌 素材图片: <!DOCTYPE html> <html lang="en"> <head> &l ...

  4. .net学习之路——调试程序

    没有人的程序是完美的,这条规则对所有的程序员来说也成立.没有人能在第一次就写出完美的程序来. 调试工具分为两类,一类是被动的,你等待它们告诉你问题:还有一类是主动的,允许你在程序运行时深入观察,并在逐 ...

  5. 移动Web开发的bug及解决方案

    我目前移动Web开发遇到的bug以及解决方案(慢慢补充当中). 1.android4.0以上一部分手机的webview中,当canvas小于屏幕大小时,绘图时会出现重影,就是说一个图只绘制了一遍,却出 ...

  6. Ajax基本概念和原理

    什么是Ajax Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. Ajax的全称是Asynchronous JavaScript and XML,即异步JavaScript+X ...

  7. 【Bootstrap】2.作品展示站点

    假设我们已经想好了要给自己的作品弄一个在线站点.一如既往,时间紧迫.我们需要快一点,但作品展示效果又必须专业.当然,站点还得是响应式的,能够在各种设备上正常浏览,因为这是我们向目标客户推销时的卖点.这 ...

  8. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q9-Q12)

    Question 9 You are designing an external binary large object (BLOB) store provider by implementing t ...

  9. Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端

    Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...

  10. 修改 Android 5.x 系统默认音量大小

    修改系统默认音量需要改两处地方: 1. frameworks\base\media\java\android\media\AudioManager.java /** @hide Default vol ...