Articles

仙剑奇侠传.MKF文件格式分析

最近突然想弄点经典的midi音乐听听,体积小而且不失音色,找了很多也没有觉得太好听的。 突然想起了当年 DOS下的仙剑,精品中的精品。于是打开IE,上网搜了一下,果然有下载。 下载之后我突然又想起了 6年前的一个往事。记得是刚上高中的时候,在同学家看见一份电脑报。 上面写了一个程序,说是可以提取仙剑中的midi音乐,当初我没看明白那段代码是怎么回事,心想网上准有这类的修改器。 等后来再想好好研究一下它的原理,却死活找不到那片文章了。同学说他把电脑报都卖了,于是此事一拖就是 6年。 所以我突然又来了兴致,想再下载一个仙剑,好好研究一下其中midi文件保存的格式。 6年后再做 6年前的事情,果然轻松了很多。下面我就详细讲一下当初DOS 版仙剑中.MKF文件的格式。

Pal

仙剑中所有的.MKF文件格式应该都是一样的,但我不明白为什么用我的方法解出来的文件有的大小却是 0字节。 .MKF文件格式如下图:

*.MKF
|-> header size(4 bytes)
|-> file 1 start offset(4 bytes) ----|
|-> ......                           |
|-> file n start offset(4 bytes) ----+---|
|-> file n + 1 start offset(4 bytes) |   |
|-> file 1(? bytes)  <---------------|   |
|-> ......                               |
|-> file n(? bytes)  <-------------------|

header size 记录了整个文件头的大小,所以其实它与第一个文件的偏移值大小相等。之后记录了没一个文件的开始偏移值,这样利用后一个文件的开始偏移值减去前一个文件的开始偏移值,就可以得出前一个文件的大小。file n + 1 start offset 指向文件的最后一个字节 + 1,也就是第n +1个文件的开始偏移值,但实际上第n + 1 个文件是不存在的。

用以上这种方法,我成功的从MIDI.MKF中提取出了87个.MID音乐文件;从MUS.MKF 中成功提取了87个.RIX音乐文件 (这种格式的文件我竟然没有见过)。从VOC.MKF中成功提取了275 个.VOC文件,但其中有几个文件的长度是0 字节的,也就是说VOC.MKF文件中存在几个连续的offset 值是一样的。还有其它几个.MKF文件中解出来的文件格式我还没有确定。

仙剑,十年前玩,时间后还在玩,不愧是经典中的经典。