内容提要
本文介绍用Python解析PS2存储卡文件系统并导出游戏存档:先解析340字节SuperBlock获取页和簇大小,再读取page与cluster并跳过备用区;随后构建FAT矩阵,通过间接FAT生成直接FAT,实现按簇编号查询FAT值;最后定义条目结构,描述文件与目录元数据,为导出指定存档奠定基础。
延伸解读
SuperBlock解析的关键点
SuperBlock固定340字节,包含魔数、版本、页大小、每簇页数等关键参数。代码使用struct.unpack时,格式字符串中的'2x'、'4x'等用于跳过忽略字段,确保正确提取page_size和pages_per_cluster。这些参数是后续计算簇大小和读取数据的基础,若解析错误将导致整个文件系统读取失败。
备用区域的处理方式
PS2记忆卡每个页包含主数据区和备用区域,备用区域大小由公式(page_size // 128) * 4计算。读取页时,代码通过偏移raw_page_size跳过备用区域,只返回主数据。这意味着备用区域中的ECC校验等信息被丢弃,但这对文件系统解析无影响,因为文件数据只存储在主区域。
FAT矩阵的构建与查询
FAT矩阵通过间接FAT构建:先从ifc_list读取间接FAT,过滤掉未分配的0xFFFFFFFF,再据此读取直接FAT。get_fat_value方法根据簇编号计算矩阵索引,并处理最高位标志:若最高位为1,表示簇已分配,取低31位作为下一簇编号;否则表示未分配。这实现了簇链的追踪。
条目结构的作用
条目结构存储文件和目录的元数据,包括模式、长度、创建时间、起始簇、修改时间、名称等。解析条目后,可以获取存档文件的起始簇和大小,结合FAT矩阵即可按簇链读取完整文件内容。这是导出指定游戏存档的最后一步,也是实现文件浏览和导出的关键。
Q&A
PS2记忆卡文件系统的SuperBlock结构有多大?包含哪些关键字段?
SuperBlock大小为340字节,关键字段包括:magic[28]、version[12]、page_size、pages_per_cluster、pages_per_block、clusters_per_card、alloc_offset、alloc_end、rootdir_cluster、ifc_list[32]、card_type、card_flags等。
如何用Python解析PS2记忆卡的SuperBlock?
使用struct.unpack()解包,格式字符串为"<28s12sHHH2xLLLL4x4x8x128s128xbbxx",可得到page_size和pages_per_cluster等字段。
PS2记忆卡中page和cluster的大小如何计算?
spare_size = (page_size // 128) * 4;raw_page_size = page_size + spare_size;cluster_size = page_size * pages_per_cluster。
读取PS2记忆卡page和cluster时如何处理备用区域?
读取page时,根据raw_page_size计算偏移,只取page_size字节,舍弃spare area;读取cluster时,循环读取pages_per_cluster个page并拼接,同样舍弃spare area。
PS2记忆卡的FAT矩阵是如何构建的?
先从ifc_list构建间接FAT矩阵,展平并排除0xFFFFFFFF未分配项,再基于间接FAT构建直接FAT矩阵。
如何根据簇编号查询PS2记忆卡中对应的FAT值?
使用get_fat_value(n)方法,通过公式计算矩阵索引,若最高位为8则取低31位,否则返回原值。
PS2记忆卡中条目(Entry)的数据结构包含哪些字段?
条目结构包含:mode、length、created[8]、cluster、modified[8]、name[32]等字段,用于描述文件和目录的元数据。