`
hgfghwq19
  • 浏览: 47734 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

MoonShell2皮肤文件(.skn) 结构解析

 
阅读更多

  首先感谢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 Skin Editor-开源

    一个编辑器,允许您打开 MoonShell2 皮肤包文件,直接查看包括文本和图像并进行编辑。

    fishshell2:开源即将成为基于Moonshell 2的DSi模式兼容媒体播放器

    开源即将成为基于Moonshell 2的DSi模式兼容媒体播放器 基于Moonshell 2 beta 5的DSi多媒体播放器可通过Devkit ARMr41在FreeBSD上编译(我认为带libs的/ opt /目录很乱)。 和lib nds1.5.x 最终将支持DPG1-4,MP3 /...

    DPGNano-开源

    DPGNano 是一个图形用户界面,用于将视频文件转换为在 Nintendo DS 的 Moonshell 中观看。

    第五次作业函数第一题代码

    第五次作业函数第一题--

    基于深度学习的作物病害诊断内含数据集和运行环境说明.zip

    本项目旨在利用深度学习方法实现作物病害的自动诊断。作物病害是农业生产中的重要问题,及时诊断和处理对于减少产量损失至关重要。 我们采用深度学习算法,通过分析作物的图像,实现对病害的自动识别和分类。项目使用的数据集包括公开的作物病害图像数据集,如ISIC等,并进行了预处理,包括图像增强、分割和特征提取等。 在运行环境方面,我们使用Python编程语言,基于TensorFlow、PyTorch等深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对作物病害的快速、准确诊断,为农业生产提供有力支持,有助于减少产量损失。同时,项目成果也可应用于其他图像识别和分类任务。

    机械设计CD驱动印刷设备step非常好的设计图纸100%好用.zip

    机械设计CD驱动印刷设备step非常好的设计图纸100%好用.zip

    tensorflow-2.7.2-cp37-cp37m-manylinux2010-x86-64.whl

    python烟花代码

    python烟花代码示例

    附件中是一个简单的烟花效果的代码示例: 在Python中,可以使用多种方式来模拟烟花效果,其中一种常用的方法是使用turtle模块,它提供了一个画布和一个小海龟,可以用来绘制各种图形。 这段代码首先导入了turtle模块和random模块,然后在屏幕上绘制了10次烟花爆炸的效果。每次爆炸都是由5个小圆组成,颜色随机选择,圆的大小也是随机的。 请注意,这段代码需要在支持turtle模块的Python环境中运行,并且需要有图形界面的支持。如果你在没有图形界面的环境中(比如某些服务器或者命令行界面),这段代码可能无法正常运行。

    商业化产品经理,到底如何实现产品商业化?.docx

    商业化产品经理,到底如何实现产品商业化?.docx

    Panduit 工业以太网部件内部销售指南

    Panduit 工业以太网部件内部销售指南

    Java版三维装箱代码示例

    在Java中,实现一个三维装箱(也称为三维背包问题)的算法通常涉及到组合优化和动态规划。这个问题是一个典型的优化问题,其中目标是在三个维度的限制下最大化价值的总和。下面是一个简单的Java代码示例,它使用动态规划来解决三维装箱问题。 请注意,这个代码只是一个简单的示例,它假设所有物品的第三个维度的大小都是1,并且没有给出如何回溯选择物品的完整逻辑。在实际应用中,三维装箱问题可能更加复杂,需要考虑所有三个维度的限制,并且可能需要更复杂的算法来解决。 此外,这个问题的解决方案可能需要根据具体问题的要求进行调整,例如物品是否可以分割、是否允许超过一个的物品等。如果你有特定的问题描述或者需要进一步的帮助,请提供更多的细节。

    常用品牌EPLAN部件库

    常用品牌EPLAN部件库

    单片机开发的教程.doc

    单片机开发的教程可以分为以下几个步骤: 1. 了解单片机基础知识:在学习单片机开发之前,需要了解单片机的相关知识,包括单片机的基本结构、指令系统、编程语言等。 2. 选择开发板:选择一款适合自己学习开发板的型号和厂商,通常需要关注开发板的性价比、开发环境是否友好等因素。 3. 学习开发环境:根据所选的开发板,学习相关的开发环境和使用方法,例如Keil、IAR等集成开发环境。 4. 掌握编程语言:单片机常用的编程语言包括C语言和汇编语言,根据实际情况选择其中一种进行学习。 5. 基础操作:熟悉单片机的引脚定义和IO口配置,了解单片机的启动代码,可以通过修改启动代码进行基本功能调试。 6. 综合实践:根据具体项目需求,进行单片机开发的综合实践。在实践中需要掌握如何编写程序、如何进行硬件调试、如何使用相关工具软件等技能。 下面是一个单片机开发的简单教程介绍: 首先,确定所使用的单片机型号和开发板类型。在这个阶段,需要查阅相关资料,了解开发板的规格书、芯片规格等基本资料。 其次,安装并配置开发环境。根据所选的开发板,安装相应的集成开发环境(IDE),并配置好开发环境。 接着,学习并掌

    Q1.ipynb

    Q1.ipynb

    (自适应手机端)IT网络建站公司pbootcms模板 互联网营销企业网站源码下载.zip

    (自适应手机端)IT网络建站公司pbootcms模板 互联网营销企业网站源码下载.zip

    Bematech 激光扫描器用户手册

    Bematech 激光扫描器用户手册

    激励视频接入文档.pdf

    激励视频接入文档.pdf

    java jdk1.8 202版本下载window linux打包

    java jdk1.8 202版本下载window linux打包

    Lite Beam M5快速指南 Lite Beam M5天线设置指南

    Lite Beam M5快速指南

    互联网金融导论.docx

    互联网金融导论.docx

Global site tag (gtag.js) - Google Analytics