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的代码质量一般,或者中等偏上,里面还有一些我无法看懂或理解的设计,当然也有一些有意思的技巧,对快速理解格式帮助较大。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值