jpcsp源码解读6:PSF文件
2012-03-20 21:28
155 查看
当你运行了模拟器,通过模拟器菜单选择并加载一个umd镜像,模拟器就用这个umd镜像实例化一个UmdIsoReader(见上一篇,源码解读5)。
通过这个UmdIsoReader,从光盘提取的第一个文件是:PSP_GAME/param.sfo
这个文件在模拟器源码中用类PSF表示。
文件中存放的是一些关于游戏的参数信息,这些信息被组织成表格。这些信息包括:对系统固件的版本要求,游戏的标题(名字),游戏的类型,游戏分级,语言,游戏版本,本游戏总共的光盘数,本光盘的盘片号
等。
文件的组织方式:最前面是文件头,紧接着放索引,然后是键表,值表。
文件头:
PSF文件标识符,是一个常量0x46535000
PSF格式版本号,常量0x0101
键表起始位置相对于文件起始位置的偏移
值表起始位置相对于文件起始位置的偏移
索引项总数
每一个索引的格式:
键名在键表中的偏移(上述文件头中有键表起始位置,加上这个偏移就可以得到这个索引所指的键)
常量4(可能表示4字节边界对齐)
键值的数据类型(有三种可能的值,分别是 PSF_DATA_TYPE_BINARY = 0,PSF_DATA_TYPE_STRING = 2,PSF_DATA_TYPE_INT32 = 4)
键值有效数据的字节数
键值有效数据加上pad部分,总共的字节数。因为要4字节对齐,所以不对齐时会有pad填充到对齐
键值在值表中的偏移(上述文件头中有值表起始位置,加上这个偏移就可以得到这个索引所指键的值)
////////////////////////////////////////////////////////////////////////////////////////////////////
回到源码:
UmdIsoReader iso = new UmdIsoReader(file.getPath()); //打开光盘镜像
UmdIsoFile psfFile = iso.getFile("PSP_GAME/param.sfo"); //从光盘镜像中提取一个参数文件
PSF psf = new PSF();
//实例一个PSF文件对象
byte[] data = new byte[(int) psfFile.length()];
//申请一个字节缓冲区,要容纳下整个psf文件
psfFile.read(data);
//将psf文件内容读取到缓冲区数组中
psf.read(ByteBuffer.wrap(data));
//从缓冲区数组中提取psf文件的内容
可以看到,这里是先从光盘中得到param.sfo文件,然后将这个文件读取到一个缓冲数组中,PSF从这个缓冲数组中提取了所有参数信息。
文件格式上文已经说明的很清楚了,PSF类中解析提取数据的实现此处不再赘述。
关于这种文件的组织格式,参考自网址:http://hitmen.c02.at/files/yapspd/psp_doc/chap26.html#sec26.4,基本就是翻译了一下。不过在模拟器的源码中确认了网页中的内容。两处细节似乎稍有差异。
通过这个UmdIsoReader,从光盘提取的第一个文件是:PSP_GAME/param.sfo
这个文件在模拟器源码中用类PSF表示。
文件中存放的是一些关于游戏的参数信息,这些信息被组织成表格。这些信息包括:对系统固件的版本要求,游戏的标题(名字),游戏的类型,游戏分级,语言,游戏版本,本游戏总共的光盘数,本光盘的盘片号
等。
文件的组织方式:最前面是文件头,紧接着放索引,然后是键表,值表。
文件头:
PSF文件标识符,是一个常量0x46535000
PSF格式版本号,常量0x0101
键表起始位置相对于文件起始位置的偏移
值表起始位置相对于文件起始位置的偏移
索引项总数
每一个索引的格式:
键名在键表中的偏移(上述文件头中有键表起始位置,加上这个偏移就可以得到这个索引所指的键)
常量4(可能表示4字节边界对齐)
键值的数据类型(有三种可能的值,分别是 PSF_DATA_TYPE_BINARY = 0,PSF_DATA_TYPE_STRING = 2,PSF_DATA_TYPE_INT32 = 4)
键值有效数据的字节数
键值有效数据加上pad部分,总共的字节数。因为要4字节对齐,所以不对齐时会有pad填充到对齐
键值在值表中的偏移(上述文件头中有值表起始位置,加上这个偏移就可以得到这个索引所指键的值)
////////////////////////////////////////////////////////////////////////////////////////////////////
回到源码:
UmdIsoReader iso = new UmdIsoReader(file.getPath()); //打开光盘镜像
UmdIsoFile psfFile = iso.getFile("PSP_GAME/param.sfo"); //从光盘镜像中提取一个参数文件
PSF psf = new PSF();
//实例一个PSF文件对象
byte[] data = new byte[(int) psfFile.length()];
//申请一个字节缓冲区,要容纳下整个psf文件
psfFile.read(data);
//将psf文件内容读取到缓冲区数组中
psf.read(ByteBuffer.wrap(data));
//从缓冲区数组中提取psf文件的内容
可以看到,这里是先从光盘中得到param.sfo文件,然后将这个文件读取到一个缓冲数组中,PSF从这个缓冲数组中提取了所有参数信息。
文件格式上文已经说明的很清楚了,PSF类中解析提取数据的实现此处不再赘述。
关于这种文件的组织格式,参考自网址:http://hitmen.c02.at/files/yapspd/psp_doc/chap26.html#sec26.4,基本就是翻译了一下。不过在模拟器的源码中确认了网页中的内容。两处细节似乎稍有差异。
相关文章推荐
- CI框架源码解读(1)-入口文件index.php
- Github docker源码之代码文件docker/image的解读
- redis源码解读之双向链表————adlist.h文件
- Caffe源码解读(四):proto文件的编写与使用
- 【机器人学】机器人开源项目KDL源码学习:(7)examples中的CMakeList.txt文件解读
- jpcsp源码解读7:HLE
- jpcsp源码解读9:指令的抽象描述与指令的译码
- JPCSP源码解读15:动态二进制翻译3(翻译引擎最终章)
- spring 源码解读与设计详解:8 Spring配置文件的读取与容器装配详析
- angularJS源码目录结构和文件的解读
- CI框架源码解读之利用Hook.php文件完成功能扩展的方法
- DEDE源码分析与学习---index.php文件解读。
- WordPress源码解读-文件的加载顺序浅析
- CTP源码分析7 CTP路由引擎结构及源码分析(一)----TreeRoute.h头文件解读和概要介绍
- Faster RCNN 源码解读(1) -- 文件结构分析
- DEDE源码分析与学习--index.php文件解读
- jpcsp源码解读之一:源码的获取与编译,以及psp详尽硬件信息文档
- DEDE源码分析与学习之三: member/archives_*.php文件解读
- jpcsp源码解读11:近期笔记
- JPCSP源码解读16:HLE与模块装载过程