存档文件通常是二进制格式;少数为json或xml但常加密或混淆,需用十六进制编辑器查看前几十字节判断:若开头为{或[且字段名可读,则可能是json。

绝大多数单机游戏存档不是标准文本,直接用 File.ReadAllText 读出来一堆乱码,说明它大概率是二进制格式。少数新游戏(比如《Stardew Valley》后期版本、《RimWorld》部分存档)会用 XML 或 JSON,但通常带加密或混淆——别急着写解析逻辑,先用十六进制编辑器(如 HxD、010 Editor)打开一个存档文件,观察前几十字节:
{ 或 [,且能大致看清字段名 → 可能是 JSON,试试 JsonSerializer.Deserialize<?xml 或 <savegame> → XML,用 <code>XDocument.LoadPK\x03\x04 → ZIP 压缩包,解压后再看内部文件
很多游戏(尤其是 Unity 引擎打包的)在 Windows 上用小端序(BitConverter.IsLittleEndian == true),但存档可能被其他平台生成,或开发者手动调用了 BigEndianBitConverter 类。更麻烦的是结构体对齐:C# 的 [StructLayout(LayoutKind.Sequential, Pack = 1)] 能强制按字节对齐,但如果你漏了 Pack = 1,BinaryReader.ReadSingle() 后面紧跟一个 int,实际读出来的值可能错位。
BinaryFormatter 替代方案说明)2A 00 00 00(小端)还是 00 00 00 2A(大端)int 表示后续数据块长度),避免越界读取导致整个解析崩掉
很多 Unity 游戏根本不用独立存档文件,而是把关键数据塞进注册表(Windows)、NSUserDefaults(macOS/iOS)或本地 SQLite 数据库。桌面版常见路径:%APPDATA%\prefs(其实是二进制 plist 或自定义格式),或者 %LOCALAPPDATA%\SavedGames\ 下的 .db 文件(可能是 LiteDB、SQLite 或加密的二进制 blob)。
ReadFile 操作,重点看非 .sav 扩展名的文件LDB\x00,SQLite 是 SQLite format 3\x00,用十六进制编辑器一眼可识别
几乎所有商业游戏存档都会在头部放校验值(CRC32、Adler32 或简单异或)和版本号(int 或字符串)。你读出来的数据看似结构正确,但角色血量总是 0 或负数,大概率是版本不匹配导致字段偏移错乱,或者校验失败后游戏主动填了默认值(而你没跳过校验直接解析)。
int),对比你手头的文档或社区贴出的版本号是否一致Terraria Save File V2,但后面紧跟着加密块 —— 别被明文骗了,得先解密再解析真正麻烦的从来不是读取本身,而是搞清那个“看似随机”的 4 字节到底代表版本、校验、还是加密 salt —— 这部分没文档时,只能靠多组存档做差分分析。
版权声明: 本站资源均来自互联网或会员发布,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!联系QQ:76900276
转载请注明: C# 读取游戏存档文件 C#如何解析特定游戏的存档数据