首先感谢Moonlight的天才的编码与审美造就的最棒的播放器和他的无私开源的精神,还要感谢风之鱼提供的修改好并添加了解包功能的源码。(好长的句子)
下面是我写的大致结构,我很少读别人写的格式文档,自己就是随便写写,描述一下结构而已。
//Moonlight's MoonShell2 Skin File (.skn) Format Manual
//[Header]
struct Header{
i8 skinFileIDLength;
char skinFileID[skinFileIDLength + 1];
i32 fileCount;
u32 HeaderSize;
}
$headerOffset=$currentPos;
//[FilesInfo]
struct FileInfo{
i32 fileNameOffset;
i32 decompSize;
i32 compSize;
i32 compDataOffset;
}[fileCount - 1];
$HeaderSize=$CurrentPos;
//[FilesData]
struct File{ //-> offset = fileNameOffset[index] + $HeaderOffset;
i8 fileNameLength;
char fileName[fileNameLength + 1];
char fileContent[compSize];
}[fileCount - 1];
/*
the storage of number in file is Little-Ending
example:
value = [0][1][2][3] = [0]*256^3+[1]*256^2+[2]*256^1+[3]
*/
这个格式有些奇怪的地方,首先是皮肤ID标签长度,跟着的就是ID。
ID在最后一次开源的版本,也就是2.00beta5(200901161857_moonshell200beta5.zip)的时候是
"Skin files package for MoonShell2 type.3" + "\0\0"
最新的版本2.10 stable时已经到了
"Skin files package for MoonShell2 type.5" + "\0\0"
虽然MoonShell2的皮肤数量不多,作者没有必要为兼容旧版本皮肤而写兼容性代码,但是这个数字的意思却是不是文件结构和格式,而是打包的文件的内容,因为2.10stable较2.00beta5新增加了不少功能,这些很多功能都是需要图片文件支持的。注意:版本ID后有个"\0\0",也就是两个NULL,Moonlight喜欢字符串内容每4个字节对齐(老实说我不知道有什么好处,难道是让文件里的u32和i32在HexEditor里对齐方便查看?),因为字符串补齐(后面的内容还有这个特性)的原因,要多增加足够的NULL。但是"Skin files package for MoonShell2 type.5" + "\0\0"长度固定是2A=42字节,所以总是增加一个NULL,总共三个NULL就够了。这个ID结尾的"\0\0"是写在代码里的应该确定是ID的一部分而不是补齐的一部分。
之后记下来的Offset是为了写完文件统计完数据之后再回头写文件的。
fileCount在源代码里是i32,我不知道文件的数量还能有负的吗?FileInfo里的数据很多也是i32,的确很奇怪。
下面还有更奇怪的地方,每个文件在压缩前都被增加了2Bytes!这2Bytes的内容也是"\0\0"。当然,这样打包的文件解包的时候也是多出两字节的。
暂时要注意的只有这些。
总的来说Moonlight的代码质量一般,或者中等偏上,里面还有一些我无法看懂或理解的设计,当然也有一些有意思的技巧,对快速理解格式帮助较大。
分享到:
相关推荐
一个编辑器,允许您打开 MoonShell2 皮肤包文件,直接查看包括文本和图像并进行编辑。
开源即将成为基于Moonshell 2的DSi模式兼容媒体播放器 基于Moonshell 2 beta 5的DSi多媒体播放器可通过Devkit ARMr41在FreeBSD上编译(我认为带libs的/ opt /目录很乱)。 和lib nds1.5.x 最终将支持DPG1-4,MP3 /...
DPGNano 是一个图形用户界面,用于将视频文件转换为在 Nintendo DS 的 Moonshell 中观看。
第五次作业函数第一题--
本项目旨在利用深度学习方法实现作物病害的自动诊断。作物病害是农业生产中的重要问题,及时诊断和处理对于减少产量损失至关重要。 我们采用深度学习算法,通过分析作物的图像,实现对病害的自动识别和分类。项目使用的数据集包括公开的作物病害图像数据集,如ISIC等,并进行了预处理,包括图像增强、分割和特征提取等。 在运行环境方面,我们使用Python编程语言,基于TensorFlow、PyTorch等深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对作物病害的快速、准确诊断,为农业生产提供有力支持,有助于减少产量损失。同时,项目成果也可应用于其他图像识别和分类任务。
机械设计CD驱动印刷设备step非常好的设计图纸100%好用.zip
python烟花代码
附件中是一个简单的烟花效果的代码示例: 在Python中,可以使用多种方式来模拟烟花效果,其中一种常用的方法是使用turtle模块,它提供了一个画布和一个小海龟,可以用来绘制各种图形。 这段代码首先导入了turtle模块和random模块,然后在屏幕上绘制了10次烟花爆炸的效果。每次爆炸都是由5个小圆组成,颜色随机选择,圆的大小也是随机的。 请注意,这段代码需要在支持turtle模块的Python环境中运行,并且需要有图形界面的支持。如果你在没有图形界面的环境中(比如某些服务器或者命令行界面),这段代码可能无法正常运行。
商业化产品经理,到底如何实现产品商业化?.docx
Panduit 工业以太网部件内部销售指南
在Java中,实现一个三维装箱(也称为三维背包问题)的算法通常涉及到组合优化和动态规划。这个问题是一个典型的优化问题,其中目标是在三个维度的限制下最大化价值的总和。下面是一个简单的Java代码示例,它使用动态规划来解决三维装箱问题。 请注意,这个代码只是一个简单的示例,它假设所有物品的第三个维度的大小都是1,并且没有给出如何回溯选择物品的完整逻辑。在实际应用中,三维装箱问题可能更加复杂,需要考虑所有三个维度的限制,并且可能需要更复杂的算法来解决。 此外,这个问题的解决方案可能需要根据具体问题的要求进行调整,例如物品是否可以分割、是否允许超过一个的物品等。如果你有特定的问题描述或者需要进一步的帮助,请提供更多的细节。
常用品牌EPLAN部件库
单片机开发的教程可以分为以下几个步骤: 1. 了解单片机基础知识:在学习单片机开发之前,需要了解单片机的相关知识,包括单片机的基本结构、指令系统、编程语言等。 2. 选择开发板:选择一款适合自己学习开发板的型号和厂商,通常需要关注开发板的性价比、开发环境是否友好等因素。 3. 学习开发环境:根据所选的开发板,学习相关的开发环境和使用方法,例如Keil、IAR等集成开发环境。 4. 掌握编程语言:单片机常用的编程语言包括C语言和汇编语言,根据实际情况选择其中一种进行学习。 5. 基础操作:熟悉单片机的引脚定义和IO口配置,了解单片机的启动代码,可以通过修改启动代码进行基本功能调试。 6. 综合实践:根据具体项目需求,进行单片机开发的综合实践。在实践中需要掌握如何编写程序、如何进行硬件调试、如何使用相关工具软件等技能。 下面是一个单片机开发的简单教程介绍: 首先,确定所使用的单片机型号和开发板类型。在这个阶段,需要查阅相关资料,了解开发板的规格书、芯片规格等基本资料。 其次,安装并配置开发环境。根据所选的开发板,安装相应的集成开发环境(IDE),并配置好开发环境。 接着,学习并掌
Q1.ipynb
(自适应手机端)IT网络建站公司pbootcms模板 互联网营销企业网站源码下载.zip
Bematech 激光扫描器用户手册
激励视频接入文档.pdf
java jdk1.8 202版本下载window linux打包
Lite Beam M5快速指南
互联网金融导论.docx