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

2、天龙八部
\
3、剑侠情缘三

4、笑傲江湖

5、刀剑2OL

PAK SOURCE

PAK SIMPLE TUTORIALS
图例

pak 数据包简介
解释
pak数据包一般用在资源打包加密上,也就是把许多文件塞入一个文件内并压缩与加密, 一般用于游戏资源和配置的打包发布,例如魔兽世界经典的mpq资源包。分类
- 普通数据包,这类数据包一般用在对应用的数据读取直接使用
- 补丁数据包,这类数据包一般用在对应用的数据包需要更新时使用
基本结构
文件标记 | 包头数据 | 文件数据 | 文件数据 ... (最基本的结构)
文件标记 | 包头数据 | HASHKEY TABLE | BLOCK TABLE | 列表信息文件数据 | 属性信息文件数据 | 文件数据 ... (pak结构)包头数据结构
包头数据为固定的一个结构体,它存放了一些最基本的pak包的信息,如版本信息、文件大小、文件的类型等等。
文件数据结构 文件块位置数据 | 文件块数据 ...
HASHKEY TABLE
顾名思义,它的存放了文件的名称,用来定位文件块数据的索引。
BLOCK TABLE
文件块数据数组,通过文件块数据索引可以获得对应文件块数据的数据存储位置(pak文件)、压缩后的大小、未压缩的大小、状态标记。
列表信息文件数据
不管是普通包还是补丁数据包都有该文件,并放在第一个文件位置,即紧跟在BLOCK TABLE之后, 主要存放了有关文件名的数据。
属性信息文件数据
不管是普通包还是补丁数据包都有该文件,并放在第二个文件位置,紧跟在列表信息文件之后, 存放了文件的版本、标记、crc32数据、时间数据、md5数据。
文件块数据及位置 文件块数据位置是一位存放文件块数据位置的数组,文件块数据为文件数据的基本单位, 在pak中一个文件块数据的基本大小为4096字节即4K。
关于普通和补丁包的区别
两者在大小上有明显的区别,因为普通包会将文件列表信息数据保持足够的大,所以会将该文件数据分配为一个大小为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插件说明(资源压缩加密)的更多相关文章
- plain framework 1 版本更新 1.0.2 增加打包插件
由于个别因素,该框架的文档没有及时的更新到博客上,但是离线的文档已经完成.本次更新对框架来说显得比较重要,因为在文档的编写过程中经过再次的阅读代码修复了不少错误,最主要的是统一了整个框架的标准风格.对 ...
- plain framework 1 1.0.3更新 优化编译部分、网络压缩和加密
有些东西总是姗姗来迟,就好比这新年的钟声,我们盼望着新年同时也不太旧的一年过去.每当这个时候,我们都会总结一下在过去的一年中我们收获了什么,再计划新的一年我们要实现什么.PF并不是一个十分优秀的框架, ...
- plain framework 商业版 开发总结2 项目管理器
任何事情都有三个阶段,分析.制作.质检的过程.在程序中就分为设计.编码.调试(测试)三个阶段,其中设计最为重要,设计的不好会导致编码和调试重复,甚至最后又回到了设计的过程.为了不会重复返工,所以设计的 ...
- plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...
- plain framework 1(简约框架)一款主要用于网络(游戏)开发的C/C++框架 即将开源发布
在我们的日常开发中,我们往往会遇到这种情况,当我们换了一个开发环境时很可能会重新利用一套新的框架进行开发.由于不同框架有着不同的接口,所以我们不得不花时间再次熟悉这些接口,这将造成开发时间上的重复,而 ...
- duilib入门之贴图描述、类html文本描述、动态换肤、Dll插件、资源打包
转载自duilib入门文档 贴图描述: Duilib的表现力丰富很大程度上得益于贴图描述的简单强大.Duilib的贴图描述分为简单模式和复杂模式两种. 简单模式使用文件名做为贴图描述内容,在这种方式下 ...
- plain framework 1 一款主要用于网络(游戏)开发的C/C++开源框架 安装篇 updated
上次介绍了一下plain framework的基础相关资料,今天该框架正式开源发布.项目的地址托管于github上,我相信大多数朋友都应该知道.今天要介绍的是该框架的目录基本结构,以及分别在linux ...
- plain framework 1 1.0.4 更新 稳定版发布
PF由于各种因素迟迟不能更新,此次更新主要是更新了以往和上个版本出现的内存问题,该版本较为稳定,如果有用到的朋友请更新至此版本. PF 1.0.4 修复1.0.0.3更新后产生的内存问题,可能导致网络 ...
- 程序设计模式浅析(plain framework商业版设计模式)
程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...
随机推荐
- windows的IIS下的负载均衡
来自http://www.cnblogs.com/allen0118/p/4294066.html 在大型Web应用系统中,由于请求的数据量过大以及并发的因素,导致Web系统会出现宕机的现象,解决这一 ...
- 图标集锦:10套免费的社交媒体 & 社交网站图标
社交网络是最近几年互联网领域最热门的关键词之一,如今社会网络化媒体也成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能. 社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还 ...
- Java2_J2EE、J2SE和J2ME的区别
解析J2EE.J2SE.J2ME.JDK的区别 本文向大家简单介绍一下JDK.J2EE.J2SE.J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务 ...
- Spring AOP专业术语解析
一. 连接点(Joinpoint) 连接点就是程序执行的某个特定的位置,如:类开始初始化前.类初始化后.类的某个方法调用前.类的某个方法调用后.方法抛出异常后等.Spring 只支持类的方法前.后.抛 ...
- [应用][js+css3]3D盒子导航[PC端]
CSS3构建的3D盒子之导航应用 1.在用css3构建的盒子表面,放上iframe,来加载导航页面. 2.鼠标左键按下移动可旋转盒子,寻找想要的网址. 3.左键单机盒子表面,将全屏现实所点盒子表面的网 ...
- 用JS描述的数据结构及算法表示——栈和队列(基础版)
前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...
- Javascript数组算法和技巧总结
Js-arrayMethod https://github.com/HerbertKarajan/Js-arrayMethod List unique an array 数组去重 random str ...
- Flex Viewer(三)——Config的原理
一.概述 在上文<深入浅出Flex Viewer(二)——体系结构>中,笔者详细介绍了到Flex Viewer框架,使得读者能够对该框架源代码的关键目录和文件结构和这些文件中所包含或涉及到 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q49-Q51)
Question 49You are designing a SharePoint 2010 intranet site for a corporation. Your design must mee ...
- 解决Dialog 消失,输入法不消失的问题
前言:今天遇到一个奇怪的问题,Activity 里面弹出一个 dialog , 这个dialog里面有EditText . 问题:当 dialog 里面的输入法出现的时候,此时让diolog 消失,输 ...