plain framework 1 pak插件说明(资源压缩加密)

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

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 = 0;
  pak::archive_t *archive = pak::archivecreate("test.pak",
                                               result,
                                               0x10000,
                                               PAK_TYPE_PATCH);
  if (NULL == archive) return -1;
  pak::fileadd(archive,
               "files\\filelist.txt",
               "files\\filelist.txt",
               PAK_FILE_ENCRYPTED | PAK_FILE_COMPRESS,
               0,
               pak::kFileTypeData);
  pak::fileadd(archive,
               "files\\filelist.txt",
               "files\\filelist.txt",
               PAK_FILE_ENCRYPTED | PAK_FILE_COMPRESS | PAK_FILE_REPLACEEXISTING,
               0,
               pak::kFileTypeData);
  ERRORPRINTF("pak::fileadd end 1.file");
  pak::fileadd(archive,
               "files\\global.txt",
               "2.file",
               PAK_FILE_ENCRYPTED | PAK_FILE_COMPRESS,
               0,
               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 -1;
  char *buffer = new char[1024 * 1024];
  if (!buffer) return -1;
  memset(buffer, 0, 1024 * 1024);
  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");
  uint64_t size, readed;
  char *buffer = new char[1024 * 1024];
  if (!buffer) return -1;
  memset(buffer, 0, 1024 * 1024);
  pak::archive_t *archive = pak::archiveopen("test.pak", result, true);
  DEBUGPRINTF("result: %d", result);
  if (!archive) return -1;
  DEBUGPRINTF("archive not NULL");
  pak::file_t *file = pak::fileopen(archive, "files\\filelist.txt", result);
  if (!file) return -1;
  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,
               0,
               pak::kFileTypeData);
  file = pak::fileopen(archive, "2.file", result);
  if (!file) return -1;
  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 -1;
  DEBUGPRINTF("archive not NULL");
  file = pak::fileopen(archive, "2.file", result);
  if (!file) return -1;
  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 0;
}

result.

1. windows

2. linux

源码说明

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

成员招募(长期有效)

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

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

时间: 2024-10-07 19:29:45

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

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

有些东西总是姗姗来迟,就好比这新年的钟声,我们盼望着新年同时也不太旧的一年过去.每当这个时候,我们都会总结一下在过去的一年中我们收获了什么,再计划新的一年我们要实现什么.PF并不是一个十分优秀的框架,可以说这只是出于作者们对自己技术的总结.本次版本比我计划的要晚,一方面是因为新年的原因,另一方面又是工作的原因,诚然这些都只不过是为推卸责任的借口,而这责任却是对自己的.再多的话语,只能留待来年,本次更新比较匆忙,希望有用到的朋友可以反馈BUG到issue上,让我能及时跟进.同时祝大家在新的一年:幸

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

网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但是在这里只讲解最本质的概念,而没有详细说明代码,如果有兴趣的不妨先看了这部分再去看下代码,一切或许会豁然开朗. 网络流 如果你不知道计算机中流数据模型的定义,那么你就可以试想一下河流,有着固定起点和终点的河流.将流水从某一个地方送向另一个地方的通道,我们现实中一般叫做渠道,这种渠道在计算机之间就是网

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

在我们的日常开发中,我们往往会遇到这种情况,当我们换了一个开发环境时很可能会重新利用一套新的框架进行开发.由于不同框架有着不同的接口,所以我们不得不花时间再次熟悉这些接口,这将造成开发时间上的重复,而对于一个程序来说又经历了一段重复造轮子的过程.在游戏开发领域,我介入的时间并不太长,大约三年时间.抱着对于游戏的热爱和激情,在这几年时间里也是一个苦苦摸索的过程.我们国人有着这么一个通病,那就是所谓的“闭关自守”,我发现有些开发者是拥有了一套代码之后便利用这套代码可以玩转整个游戏界.我能了解这些朋友

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

任何事情都有三个阶段,分析.制作.质检的过程.在程序中就分为设计.编码.调试(测试)三个阶段,其中设计最为重要,设计的不好会导致编码和调试重复,甚至最后又回到了设计的过程.为了不会重复返工,所以设计的时候需要考了全面,否则会导致资源上的浪费和占用,甚至造成资源不足而终止.就像任何一个投资项目一样,设计的不好,往往会导致人力资源的浪费,如果在项目进程中达不到预期的效果,这个项目生命周期就会缩短. 1.项目管理器设计 为什么要使用到项目管理器?如果这点都不明确,那么这样的功能需求是无效的,也就是说不

FIS常用功能之资源压缩

fis server start后 资源压缩,只需要使用命令,不需要添加任何配置 fis release --optimize 或: fis release -o 在浏览器访问按F12,观看压缩前后文件大小对比:

plain framework 1 1.0.4 更新 稳定版发布

PF由于各种因素迟迟不能更新,此次更新主要是更新了以往和上个版本出现的内存问题,该版本较为稳定,如果有用到的朋友请更新至此版本. PF 1.0.4 修复1.0.0.3更新后产生的内存问题,可能导致网络数据错误 全面修复PF核心的内存问题 优化部分代码风格 PF商业版核心人员招募 开篇语 我们没有大神,只有解决问题的人. 我们没有强悍的技术,只有一颗向往简单的心. 我们没有惊人的理论,只有一堆不可思议的妄想. 我们不需要复杂,只需要够简洁. 我们不需要固定的思维,只需要你能想得到. 核心成员资格需

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

程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在经历了若干年后忽然重写整套代码的原因,因为他们会发现在越来越多的需求的情况下,以前那些设计模式完全不能满足了,或者说程序的复杂度和维护成本实在太高.最近我又看到了一个公司的项目设计,文档中写的还算优秀,可是整体的框架设计总觉得还有差强人意.那么我们又该怎样来设计我们的程序,怎么减少维护代码的成本,怎

megapix-image插件 使用Canvas压缩图片上传

<!DOCTYPE html > <html> <head> <title>通过Canvas及File API缩放并上传图片</title> <script src="/Scripts/Jquery/jquery-1.8.3.min.js" type="text/javascript"></script> <script src="/Scripts/MegaPixIm

plain framework 1 参考手册 入门指引之 模块

模块 总述 基础 数据库 引擎 事件 文件 网络 性能 脚本 系统 工具 总述 上图为plain framework(简称简约框架)所有的模块,包括基础.数据库.引擎.事件.文件.网络.性能.脚本.系统.工具模块,各个模块的详细介绍请看以下的独立说明. 基础模块 基础模块提供了基本的操作,包括时间.容器.字符串.日志.输入/输出流. 数据库模块 数据库模块提供了基本的数据操作接口,提供了查询以及结果集获取的方法. 引擎模块 引擎模块作为整个框架的核心,具有举足轻重的地位,我们的应用也是在引擎的扩