XGP存档迁移技术指南:跨平台游戏进度解决方案
【免费下载链接】XGP-save-extractorPython script to extract savefiles out of Xbox Game Pass for PC games项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor
一、问题诊断:平台存档不兼容的技术根源
游戏玩家在不同平台间切换时,常面临存档无法互通的问题。Xbox Game Pass (XGP) 与Steam平台采用截然不同的存档管理机制,导致直接迁移存档文件往往以失败告终。这种不兼容性主要源于三个核心技术差异:
平台存档系统差异对比表
| 技术指标 | XGP存档系统 | Steam存档系统 |
|---|---|---|
| 存储位置 | %LOCALAPPDATA%\Packages下的加密容器 | 游戏目录或%APPDATA%下的明文文件 |
| 文件格式 | 采用WGS容器格式,包含GUID索引 | 多为直接可识别的.sav、.bin等格式 |
| 组织结构 | 按用户ID和游戏包名分层存储 | 通常按游戏ID或用户配置文件组织 |
| 元数据处理 | 包含FILETIME时间戳和权限信息 | 较少元数据,主要依赖文件名标识 |
| 加密方式 | 部分游戏采用平台特定加密 | 多数为未加密或简单校验机制 |
常见迁移失败场景:
- 将XGP的WGS容器文件直接复制到Steam游戏目录
- 尝试修改存档文件扩展名以匹配目标平台
- 忽略不同平台间存档结构的组织差异
二、解决方案:XGP存档提取器的技术实现
XGP存档提取器通过深入理解两种平台存档系统的技术差异,实现了从WGS容器中提取并转换存档文件的功能。该工具采用Python开发,核心架构包含四个功能模块:
技术架构解析
存档定位系统
- 通过解析
games.json配置文件识别已安装游戏 - 扫描系统中
%LOCALAPPDATA%\Packages目录下的游戏包 - 定位特定游戏的WGS容器文件结构
- 通过解析
容器解析引擎
- 读取WGS容器索引文件(
containers.index) - 解析FILETIME时间戳和GUID标识
- 处理容器内文件的GUID匹配与路径映射
- 读取WGS容器索引文件(
格式转换处理器
- 根据游戏类型应用不同转换策略(1c1f、1cnf、1cnf-folder等)
- 处理特殊游戏的存档合并与分割(如《星空》的SFS文件组装)
- 生成目标平台兼容的文件结构与命名规范
存档打包系统
- 创建ZIP压缩包包含所有转换后的存档文件
- 添加时间戳和用户标识信息到文件名
- 确保文件权限和目录结构符合目标平台要求
支持游戏范围
工具目前支持超过30款热门游戏,主要分为以下几类处理策略:
| 处理类型 | 特征 | 代表游戏 |
|---|---|---|
| 1c1f | 单容器单文件 | 《原子之心》《赛博朋克2077》 |
| 1cnf | 单容器多文件 | 《哈迪斯》《星露谷物语》 |
| 1cnf-folder | 多容器文件夹结构 | 《女神异闻录5》《忍者龙剑传》 |
| 特殊处理 | 自定义格式转换 | 《星空》《控制》《幻兽帕鲁》 |
三、实践操作:场景化任务指南
场景一:初次使用的技术用户
任务目标:从XGP版《星空》迁移存档到Steam平台
前置条件:
- 已安装Python 3.8+环境
- 已安装Git工具
- 具备基础命令行操作能力
操作步骤:
获取工具代码
# 克隆项目仓库 git clone https://gitcode.com/gh_mirrors/xg/XGP-save-extractor # 进入项目目录 cd XGP-save-extractor执行提取程序
# 运行Python脚本 python main.py # 程序会自动扫描系统中的支持游戏 # 输出示例: # Installed supported games: # - Starfield # Save files for user Gamer123: # - Saves/Autosave_001.sfs # - Saves/ManualSave_001.sfs # Save files written to "starfield_gamer123_2023-11-15_14_30_22.zip"存档迁移到Steam
# 解压生成的ZIP文件 unzip starfield_gamer123_2023-11-15_14_30_22.zip -d starfield_saves # 复制到Steam版《星空》存档目录 # 注意替换<用户名>为实际系统用户名 cp -r starfield_saves/Saves/* "/home/<用户名>/.local/share/Steam/steamapps/compatdata/1716740/pfx/drive_c/users/steamuser/Documents/My Games/Starfield/Saves/"
场景二:普通用户的图形化操作
任务目标:为《幻兽帕鲁》转换存档,无命令行经验
操作步骤:
- 下载预编译的可执行文件版本(项目发布页获取)
- 双击运行
XGP-save-extractor.exe - 在图形界面中选择《幻兽帕鲁》
- 点击"提取存档"按钮
- 在生成的ZIP文件中找到转换后的存档
- 将存档复制到Steam版《幻兽帕鲁》的存档目录:
C:\Users\<用户名>\AppData\Local\Pal\Saved\SaveGames
⚠️警告:转换前请确保XGP游戏已完全关闭,Xbox云同步已完成。未同步的存档可能导致数据损坏或丢失。
四、技术拓展:高级应用与自定义开发
批量处理自动化
对于需要迁移多个游戏存档的高级用户,可以编写简单的批处理脚本实现自动化:
#!/bin/bash # batch_extract.sh - 批量提取多个游戏存档 # 定义要提取的游戏名称列表 GAMES=("Starfield" "Palworld" "Hades") # 循环提取每个游戏 for GAME in "${GAMES[@]}"; do echo "开始提取 $GAME 存档..." # 使用grep过滤特定游戏输出 python main.py | grep -A 10 "$GAME" echo "$GAME 存档提取完成" echo "------------------------" done echo "所有游戏存档提取完毕"添加新游戏支持
要为工具添加对新游戏的支持,需修改games.json文件:
{ "name": "新游戏名称", "package": "游戏的PackageFamilyName", "handler": "处理类型", "handler_args": { "suffix": ".sav" // 根据需要添加参数 } }获取PackageFamilyName的方法:
- 打开
%LOCALAPPDATA%\Packages目录 - 找到对应游戏的文件夹,其名称即为PackageFamilyName
常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 工具无法找到游戏 | 游戏未安装或PackageFamilyName不匹配 | 确认游戏已安装,检查games.json配置 |
| 提取的存档无法加载 | 存档格式转换不完整 | 查看工具输出日志,确认是否有错误提示 |
| ZIP文件生成失败 | 权限不足或磁盘空间不足 | 以管理员身份运行,检查目标磁盘空间 |
| 部分文件提取失败 | 云同步未完成 | 等待Xbox云同步完成后重试 |
五、技术原理深度解析
WGS容器格式解析
XGP存档使用Windows游戏存档(WGS)系统,其核心结构包括:
- containers.index:存档索引文件,包含容器元数据
- GUID命名的容器目录:每个容器包含一个或多个存档文件
- FILETIME时间戳:用于同步和版本控制的时间信息
解析过程关键代码片段:
# 读取容器索引文件 with containers_idx_path.open("rb") as f: # 跳过文件头 f.read(4) # 获取容器数量 container_count = struct.unpack("<i", f.read(4))[0] # 读取包名称 store_pkg_name = read_utf16_str(f).split("!")[0] for _ in range(container_count): # 读取容器名称 container_name = read_utf16_str(f) # 读取容器GUID container_guid = uuid.UUID(bytes_le=f.read(16)) # 读取创建时间 container_creation_date = read_filetime(f) # 处理容器内文件...跨平台格式转换技术
以《星空》为例,其存档转换需要特殊处理:
- 从多个容器中提取"toc"和"BlobDataN"文件
- 按序号合并数据块
- 添加必要的填充数据使文件大小符合16字节对齐
- 生成Steam版本兼容的SFS格式文件
# 关键代码片段:《星空》存档合并 for idx, part_path in sorted(parts.items(), key=lambda t: t[0]): with open(part_path, "rb") as part_f: data = part_f.read() size = sfs_f.write(data) # 添加填充数据 pad = 16 - (size % 16) if pad != 16: sfs_f.write(pad_str[:pad].encode("ascii"))六、总结与展望
XGP存档提取器通过深入解析平台存档系统差异,为跨平台游戏进度迁移提供了可靠解决方案。其核心价值在于:
- 技术透明性:开源实现让用户可以验证存档处理过程
- 广泛兼容性:支持30+款热门游戏,持续更新中
- 操作简便性:提供命令行和图形界面两种使用方式
- 数据安全性:只读操作原存档,生成独立备份文件
随着云游戏和跨平台游戏的普及,存档兼容性问题将变得更加重要。未来版本计划增加:
- 云存档直接同步功能
- 存档版本控制与比较工具
- 更多平台支持(如Epic Games Store)
通过理解存档系统的技术细节,玩家可以更自信地在不同平台间切换,真正实现游戏进度的无缝迁移。
【免费下载链接】XGP-save-extractorPython script to extract savefiles out of Xbox Game Pass for PC games项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考