UE4 Pak 文件格式
UE4 Pak 文件格式
https://wangjie.rocks/2019/01/10/ue4-pak/
UE4 Pak 文件格式
jashwang 收录于 Unreal engine4
2019-01-10 约 1735 字 预计阅读 4 分钟
UE4 打包过程中,会调用 UnrealPak 将 Cook 后的文件资源打包成一整个 Pak 文件,这个 Pak 中的内容可以分为三大块,按写入顺序分别为:文件内容区 + 文件索引信息区 + Pak文件信息区
文件内容区: 依次存储每个文件的 FPakEntry + 文件内容
文件索引信息区: 依次存储每个文件的 文件名 + FPakEntry
Pak文件信息区: 存储整个 Pak 文件的信息
注意: 文件内容区 和 文件索引信息区 FPakEntry 部分除了 Offset 外是冗余存储的,文件内容区域的 FPakEntry 序列化时 Offset 的8字节内容全为 0,如图
Pak文件信息区: FPakInfo
这个结构体序列化后,写到pak文件的最后的地方,固定 45 字节,格式如下,代码见 FPakFile::Initialize
bEncryptedIndex: 1 字节,表示pak的索引部分是否被加密
Pak 文件加密的基本过程:编译时,TargetRules.cs 文件中会添加一个宏定义
IMPLEMENT_ENCRYPTION_KEY_REGISTRATION()
,这个宏展开成UE_REGISTER_ENCRYPTION_KEY(YourAESKeyCode)
,这个宏里会声明一个全局结构体实例GEncryptionKeyRegistration
,在构造函数里调用RegisterEncryptionKeyCallback
注册一个回调,这个回调就是返回 YourAESKeyCode,RegisterEncryptionKeyCallback
这个函数里其实就是向FCoreDelegates::GetPakEncryptionKeyDelegate
里绑定了一个 lambda,lambda里调用回调函数获取密钥。完整的宏展开流程IMPLEMENT_APPLICATION
->IMPLEMENT_ENCRYPTION_KEY_REGISTRATION
->UE_REGISTER_ENCRYPTION_KEY
。也就是说,默认 Pak 加密的 AES 密钥是硬编码在代码里的Magic: 4 字节,值必须为 0x5A6F12E1,否则是非法pak
Version: 4 字节,pak文件格式的版本号
每个版本的区别如下:
- 1:初始版本号
- 2: 移除了 FPakEntry 中的时间戳
- 3:增加文件加密功能和分块压缩功能,FPakEntry 中多了分块信息数据和是否加密的标志位
- 4:增加索引加密功能,FPakInfo 中多了索引是否加密的标志位
- 5:压缩分块信息中的起始和结束位置是相对于 FPakEntry.Offset 的偏移,之前的版本是相对于 Pak 文件起始位置(即0)的偏移
IndexOffset: 8 字节,Pak 文件索引信息区的起始位置
IndexSize: 8 字节,Pak 文件索引信息区的大小
IndexHash: 20 字节,文件索引信息的SHA1值
文件索引信息区
从上面的结构体中根据索引的起始偏移和大小定位索引内容,并且根据 bEncryptedIndex 来判断是否要对索引内容进行解密,格式如下,代码见 FPakFile::LoadIndex
MountPoint: 默认挂载点,类型是字符串,长度不定。字符串序列化格式为:4字节(内容为字符串长度) + 字符串内容(字符串以0结尾)
NumEntries: 4 字节,序列化的文件数量
接下来就是依次存储每个文件的 Filename(文件路径) 和对应的 FPakEntry,有 NumEntries 个
Filename
FPakEntry
FPakEntry 记录的是每一个文件序列化到 Pak 中的文件头信息,序列化格式如下
Offset: 8 字节,文件实际内容区域起始位置在 Pak 文件中的偏移,第一个文件就是 0
Size:8 字节,文件压缩后的大小
UncompressedSize:8 字节,文件原始大小
CompressionMethod: 4 字节,文件压缩方式,见 ECompressionFlags
Timestamp: 8 字节,时间戳,这个数据只在老版本的pak(Version <= 1) 中才有,Version >= 2 中的 pak 已经废弃不序列化了
Hash: 20 字节,文件的SHA1哈希值
CompressionBlocks: 分块信息列表,每一个分块信息为 16 字节(两个 uint64,分别是块内容起始位置偏移和结束位置偏移)。分块信息数据只有在 Version >= 3,并且开启了压缩的情况下才会序列化。TArray 的序列化格式为: 4 字节(内容为Array长度) + 每一个 Array项 的序列化。所以这部分数据大小为: 4 + 16 * 分块数量,下面的图中只有一个分块
bEncrypted: 1 字节,文件块内容是否加密,这部分数据只有在 Version >= 3 才有
CompressionBlockSize: 4 字节,每一个压缩分块的大小,这部分数据只有在 Version >= 3 才有。序列化时,每个文件会按这个值进行分块,然后每个分块再进行压缩加密,默认值是 64K,如果文件大小小于这个值,则CompressionBlockSize 就是文件实际大小。反序列化时,读取每个分块,进行解密,然后再分配CompressionBlockSize 大小的内存进行解压,所有的内存块合起来就是真正的文件内容,下图的分块大小是 1055
文件内容区
这个区域位于 Pak 文件的起始位置,依次存储每一个文件的 FPakEntry 和实际文件内容,如果开启了压缩,则文件内容需要进行分块压缩,如果开启了加密,则压缩过的文件内容还要进行加密
本文于 2019-01-10 更新
UE4
返回 | 主页
Bluelua 新特性: 在 lua 中重载蓝图函数 UE4基础:搭建开发环境
0 条
UE4 Pak 文件格式相关推荐
- UE4 Pak文件操作
解压PAK: 执行EXE文件 PAK路径 -extract 输出路径 压缩PAK: 执行EXE文件 保存PAK文件 压缩文件列表
- UE4 Pak跨引擎版本错误记录
原创文章,转载请注明出处. 事情是这样的,4.25.0版本的engine使用着,发现4.25有release版本了,故就升级到了4.25.4(4.25的release版本).升级上来之后发现了一个问题 ...
- UE4 pak生成和加载
本文转自:http://blog.csdn.net/u014532636/article/details/72844367 1.创建一个PAK文件: 用CMD运行打开D:\Epic Games\UE_ ...
- UE4 热更新系统开发
哈喽,大家好,我叫人宅,很高兴和大家分享本套课程的内容. 在我们部署好我们的服务器后,有没有为我们的资源更新和资源下载而苦恼过,有没有为UE4 pak加载加密和读取解密而费尽脑汁过,有没有为我们资源压 ...
- UE4 C++(20) UnrealPak打包和打补丁
12/27/2020 文章目录 前言 打包(Package) 资源类型 执行打包命令 HotPatcher插件 获取资源信息(GetAssetData) 路径转换(ConvLongPackageNam ...
- 2022年9月12日-9月18日(ue4热更新视频教程+rhi模块源码抄写调剂。本周20小时。合计1582小时,剩余8418小时。)
目前进行到mysql(7.1),tf1(2.3),oss(12.1),蓝图反射(1.7),ue4 pak(8.6), 从上周最后两天可以看到,基本上调整月计划后,可以完成任务.且打游戏已经没有吸引力了 ...
- 2022年9月计划(ue4热更新视频教程+抄写rhi部分源码)
按照目前规划,本月进行热更新. 半小时可以看和调试10时长的视频,每天2.5小时视频,即进行7.5小时 按照引擎使用和抄写(9月1日开始抄写)同时进行,按规划,rhi部分源码总共47949行(含注释) ...
- 2022年8月29日-2022年9月4日(ue4热更新视频教程学习和rhi源码抄写,本周40小时,合计1522小时,剩余8478小时。)
目前Ue4视频教程进行到了 mysql(7.1),tf1(2.3),oss(12.1),蓝图反射(1.7),ue4 apk(3.7), 根据月计划,本周进行以下内容.rhi部分源码总共47949行(含 ...
- 2022年9月19日--9月25日(ue4热更新视频教程为主,本周10小时。合计1592小时,剩余8408小时)
目前进行到mysql(7.1),tf1(2.3),oss(12.1),蓝图反射(1.7),ue4 pak(10.3), 从上周看,很不理想,原以为上班时间能学习下,结果会议室人来人往,不能指望这个了, ...
最新文章
- latex 文章前头引用包
- 基本函数依赖和候选键_5G 通信候选波形的设计和评测解决方案
- win7冒险岛java,win7玩冒险岛不兼容怎么办?解决win7玩冒险岛不兼容的方法
- linux服务器上网页变形,Linux服务器上用iScanner删除网页恶意代码的方法
- 为了进大厂,我所经历的奇葩面试
- VB.NET工作笔记007---ASP.NET中Session超时一直不起作用
- 通过iLO进行Zabbix监控——针对HP服务器集成
- 数据库创建/删除视图语句
- 电脑维修小知识(我抄的!)
- html video ajax,利用AJAX开源项目 在网页里播放视频实现方法
- 雪花漂浮php,h5canvas实现雪花飘落的特效代码
- AB-test理解与实战
- 终端连接阿里云服务器出现Permission denied (publickey)解决方法
- 微信小程序云开发:使用cms平台来创建json数组
- android 关闭jack_编译Android时禁用Jack Server
- IC卡读卡器卡号输出格式
- Tita:OKR教练专家的6个OKR实施技巧
- selenium 淘宝登陆购买,基础实现
- 计算机软件著作权一般要多久,软件著作权一般多长时间
- 大连无线腾讯面试(问题)
热门文章
- 初学python的体会心得-分享给入门Python小白的学习心得
- 一男老师每日百词转载+连载(2)
- qt ini文件的读、写、删除
- 村庄规划中的产业发展规划
- 《高性能MySQL》(第三版)之一:MySQL架构与基础
- Camera AF和FF
- mqtt 变为乱码 接受16进制字节流_转战物联网#183;基础篇07-深入理解MQTT协议之控制报文(数据包)格式...
- 关于word页眉页脚的设置-页码不连续的问题
- Word 2016 for Mac(文档和文字处理软件)激活教程
- MBT测试思想在苏宁蛙测的运用实践分享