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 注册一个回调,这个回调就是返回 YourAESKeyCodeRegisterEncryptionKeyCallback 这个函数里其实就是向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 文件格式相关推荐

  1. UE4 Pak文件操作

    解压PAK: 执行EXE文件  PAK路径 -extract 输出路径 压缩PAK: 执行EXE文件 保存PAK文件 压缩文件列表

  2. UE4 Pak跨引擎版本错误记录

    原创文章,转载请注明出处. 事情是这样的,4.25.0版本的engine使用着,发现4.25有release版本了,故就升级到了4.25.4(4.25的release版本).升级上来之后发现了一个问题 ...

  3. UE4 pak生成和加载

    本文转自:http://blog.csdn.net/u014532636/article/details/72844367 1.创建一个PAK文件: 用CMD运行打开D:\Epic Games\UE_ ...

  4. UE4 热更新系统开发

    哈喽,大家好,我叫人宅,很高兴和大家分享本套课程的内容. 在我们部署好我们的服务器后,有没有为我们的资源更新和资源下载而苦恼过,有没有为UE4 pak加载加密和读取解密而费尽脑汁过,有没有为我们资源压 ...

  5. UE4 C++(20) UnrealPak打包和打补丁

    12/27/2020 文章目录 前言 打包(Package) 资源类型 执行打包命令 HotPatcher插件 获取资源信息(GetAssetData) 路径转换(ConvLongPackageNam ...

  6. 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), 从上周最后两天可以看到,基本上调整月计划后,可以完成任务.且打游戏已经没有吸引力了 ...

  7. 2022年9月计划(ue4热更新视频教程+抄写rhi部分源码)

    按照目前规划,本月进行热更新. 半小时可以看和调试10时长的视频,每天2.5小时视频,即进行7.5小时 按照引擎使用和抄写(9月1日开始抄写)同时进行,按规划,rhi部分源码总共47949行(含注释) ...

  8. 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行(含 ...

  9. 2022年9月19日--9月25日(ue4热更新视频教程为主,本周10小时。合计1592小时,剩余8408小时)

    目前进行到mysql(7.1),tf1(2.3),oss(12.1),蓝图反射(1.7),ue4 pak(10.3), 从上周看,很不理想,原以为上班时间能学习下,结果会议室人来人往,不能指望这个了, ...

最新文章

  1. latex 文章前头引用包
  2. 基本函数依赖和候选键_5G 通信候选波形的设计和评测解决方案
  3. win7冒险岛java,win7玩冒险岛不兼容怎么办?解决win7玩冒险岛不兼容的方法
  4. linux服务器上网页变形,Linux服务器上用iScanner删除网页恶意代码的方法
  5. 为了进大厂,我所经历的奇葩面试
  6. VB.NET工作笔记007---ASP.NET中Session超时一直不起作用
  7. 通过iLO进行Zabbix监控——针对HP服务器集成
  8. 数据库创建/删除视图语句
  9. 电脑维修小知识(我抄的!)
  10. html video ajax,利用AJAX开源项目 在网页里播放视频实现方法
  11. 雪花漂浮php,h5canvas实现雪花飘落的特效代码
  12. AB-test理解与实战
  13. 终端连接阿里云服务器出现Permission denied (publickey)解决方法
  14. 微信小程序云开发:使用cms平台来创建json数组
  15. android 关闭jack_编译Android时禁用Jack Server
  16. IC卡读卡器卡号输出格式
  17. Tita:OKR教练专家的6个OKR实施技巧
  18. selenium 淘宝登陆购买,基础实现
  19. 计算机软件著作权一般要多久,软件著作权一般多长时间
  20. 大连无线腾讯面试(问题)

热门文章

  1. 初学python的体会心得-分享给入门Python小白的学习心得
  2. 一男老师每日百词转载+连载(2)
  3. qt ini文件的读、写、删除
  4. 村庄规划中的产业发展规划
  5. 《高性能MySQL》(第三版)之一:MySQL架构与基础
  6. Camera AF和FF
  7. mqtt 变为乱码 接受16进制字节流_转战物联网#183;基础篇07-深入理解MQTT协议之控制报文(数据包)格式...
  8. 关于word页眉页脚的设置-页码不连续的问题
  9. Word 2016 for Mac(文档和文字处理软件)激活教程
  10. MBT测试思想在苏宁蛙测的运用实践分享