【免费下载链接】PalworldSaveToolsPalworldSaveTools - A comprehensive toolkit designed to fix, transfer, edit, and manage your Palworld save files with ease.项目地址https://gitcode.com/gh_mirrors/pa/PalworldSaveTools点击查看免费下载你是否想知道 Palworld 的 .sav 存档文件里到底藏着什么开源工具 PalworldSaveToolsPST就是为 Palworld 存档文件而生的全套工具修复损坏存档、跨服转移、编辑玩家与幻兽、管理基地和公会。本文带你逆向解析 Palworld 存档文件格式看懂 PST 内置的 palsav 引擎如何一层层拆解 GVAS 容器与 OozOodle压缩还原出可读的 JSON 数据。一、.sav 文件不是普通文本SAV 外层封装结构Palworld 的存档如Level.sav是二进制文件且被压缩过。palsav 引擎第一步要做的是识别并剥离这层外壳。外层封装的头部结构非常精简小端字节序在 src/palsav/palsav/compressor/init.py 中实现偏移长度字段说明04 字节uncompressed_len解压后数据长度44 字节compressed_len压缩后数据长度83 字节magic魔数用于识别压缩类型111 字节save_type存档类型编号12—压缩数据真正的内容主体其中魔数magic bytes决定了压缩算法定义在 src/palsav/palsav/compressor/enums.py魔数SaveType 编号压缩算法PlZ50PLZ双重 zlibPlM49PLMOodleOoz压缩CNK48CNKzlib带 24 字节扩展头CNK格式多一层 12 字节的包装头解析时 _parse_sav_header() 会自动偏移字段位置来适配。也就是说只需读取第 8~10 字节就能判断这份 Palworld 存档用的是哪种压缩——这正是check_sav_format()的工作。二、Ooz 压缩palsav 如何解开 Oodle 黑盒新版 Palworld 存档采用PlM格式即 Oodle 压缩。Oodle 是商业压缩库普通开源环境无法直接解压这也是 Palworld 存档工具的一大难点。PST 的解法是内置了 src/palsav/palooz/ 模块它把 ooz 开源项目中的Kraken算法 C 源码见 src/palsav/palooz/palooz/ooz/dep/ooz/含kraken.cpp、lzna.cpp等编译为 Python 原生扩展palooz支持 x64 与 ARM64。解压流程在 src/palsav/palsav/compressor/oozlib.pydecompress()先调用check_sav_format()确认是PlM格式若是PlZ会明确报错解析 12 字节头部取出压缩数据区间调用palooz.decompress()还原出原始字节流并校验长度是否等于头部声明的uncompressed_len。与之对称的 zlib 分支在 src/palsav/palsav/compressor/zlib.py——值得注意的是它执行的是两次zlib.compress/decompress对应游戏的双重 zlib 压缩。两条路径由 src/palsav/palsav/core.py 中的decompress_sav_to_gvas()统一调度match format: case SaveType.PLZ | SaveType.CNK: return z_lib.decompress(data) case SaveType.PLM: return oozlib.decompress(data)三、GVAS 容器Unreal 引擎的存档信封剥掉压缩层后得到的是一串 GVAS 数据——Unreal 引擎通用的存档序列化容器。palsav 在 src/palsav/palsav/gvas.py 中定义了它的读取流程魔数校验第一个 i32 必须是1396790855十六进制0x53415647即小端的 GVAS见 gvas.py#L24-L29存档版本save_game_version必须为 3否则直接抛异常引擎信息依次读取 UE4/UE5 包版本、引擎主/次/补丁版本号u16与 changelistu32Custom Versions格式编号为 3随后是一组(GUID, 版本号)对用于兼容不同版本的序列化差异存档类名一个 FString之后到文件末尾的全部是属性列表Properties最后以 4 个零字节收尾。真正逐字段消费这些字节的是 src/palsav/palsav/archive.py 中的FArchiveReader/FArchiveWriter它们提供了fstring()、i32()、u16()、guid()、tarray()、struct()等原语完整覆盖了 UE4 属性系统的类型NameProperty、ArrayProperty、StructProperty 等。这也是 Palworld 存档编辑器能读得进、写得回的关键。四、Palworld 私有结构Type Hints 与自定义解码器GVAS 只是信封里面大量字段是游戏自定义的RawData二进制块比如每只幻兽的完整数据。palsav 用两套机制来处理它们全部集中在 src/palsav/palsav/paltypes.pyPALWORLD_TYPE_HINTS类型提示告诉读取器这个路径下的属性按 StructProperty 解析。例如.worldSaveData.GroupSaveDataMap.Key按Guid解析.worldSaveData.BaseCampSaveData.Value按结构体解析。没有这些提示通用解析器只能看到一坨未知字节。PALWORLD_CUSTOM_PROPERTIES自定义编解码器为每个私有结构注册一对decode/encode函数。例如幻兽数据块由 src/palsav/palsav/rawdata/character.py 解码——它会二次进入RawData字节流还原出object属性、group_id等字段并原样保留尾部未知字节确保写回时不丢数据。同样的模式覆盖物品容器item_container.py、基地营地base_camp.py、公会仓库guild_item_storage.py、工作分配work.py、地图物件map_object.py等全部位于 src/palsav/palsav/rawdata/ 目录。五、完整管线从 SAV 到 JSON 再回到 SAV把上面三层串起来palsav 的完整数据流是解封装读 12 字节头部识别PlM/PlZ/CNK解压缩Ooz 或 zlib 还原出 GVAS 字节流decompress_sav_to_gvasGVAS 解析校验魔数与版本逐属性反序列化为 dictGvasFile.read结构解码按 Type Hints 自定义解码器展开私有结构得到纯 JSON 树gvas_file.dump()可逆写回GvasFile.load()→write()→compress_gvas_to_sav()重新封装为合法的 .sav。这套管线也直接暴露为命令行工具详见 src/palsav/README.md# SAV → JSON uv run palsav Level.sav --to-json # JSON → SAV可选择压缩库 uv run palsav Level.sav.json --from-json --library zlib 性能上palsav 使用orjson加速 JSON 读写并在解析期间自动关闭 GC80MB 的大存档也能在合理时间内完成转换。六、总结逆向 Palworld 存档的三个关键点关键点对应模块一句话说明12 字节 SAV 头部 魔数compressor/init.py判断压缩类型Ooz Kraken 原生绑定palooz/解开 Oodle 压缩黑盒GVAS 魔数 0x53415647gvas.py校验 Unreal 存档容器Type Hints 自定义解码器paltypes.py还原幻兽、基地等私有结构理解了这条 SAV 封装 → Ooz 压缩 → GVAS 容器 → 私有结构 的链路你就掌握了 Palworld 存档文件格式逆向的全部骨架。在此基础上PST 的图形界面、玩家管理、幻兽编辑器等功能才有用武之地。想动手实验的话从palsav的--to-json开始观察输出 JSON 中worldSaveData的各个字段是理解这套格式最快的方式。赞分享【免费下载链接】PalworldSaveToolsPalworldSaveTools - A comprehensive toolkit designed to fix, transfer, edit, and manage your Palworld save files with ease.项目地址https://gitcode.com/gh_mirrors/pa/PalworldSaveTools点击查看免费下载相关推荐Smithbox 底层文件解析引擎 SoulsFormatsFromSoftware 文件格式读写与 DCX 压缩实战指南Smithbox 底层文件解析引擎 SoulsFormatsFromSoftware 文件格式读写与 DCX 压缩实战指南 本文是围绕 Smithbox 仓库开发工具桌面应用3D渲染LogicStack-LeetCode 题解实战273. 整数转换英文表示——基于「三位一组 分段拼接」的字符串大模拟LogicStack LeetCode 题解实战273. 整数转换英文表示——基于「三位一组 分段拼接」的字符串大模拟 本文基于 LogicStack LPalworld存档工具解析处理非压缩存档的异常情况Palworld存档工具解析处理非压缩存档的异常情况 背景介绍 Palworld作为一款热门的生存建造类游戏其存档系统采用了特定的数据格式。开源项目palw开发工具游戏开发上一篇DynamicCow开发者指南项目架构、Xcode构建与二次开发完整教程下一篇Forza-Mods-AIO FH4与FH5如何共存于一套代码库双游戏支持设计完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考