日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UE4 Pak 文件格式

發布時間:2023/12/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 文件格式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。