umd文件结构深度解剖(附手机umd电子书生成算法类|PHP版)

记得刚开始准备做小说下载站时(UMD格式的电子书应该在Nokia机上是相当的流行吧),研究UMD文件,在网上搜不到UMD文件结构说明.费了好大的劲,用反编译工具才找到相关信息.可惜对C#不了解,只能摸到点皮毛,差点就放弃了,后来一个偶然的机会看到2lin兄和Mark兄的结构文章,振奋人心啊,于是对着UE打开标准umd文件的16进制码和2位仁兄的结构分析,用偶熟悉的php,做了一个umd生成类,对umd文件编码。解码应该也很简单的一个求逆运算,就不啰嗦了。

相关关键字节含义:

0×23,也就是字符’#’,这个字符在Umd中被用来作为功能块的分割符。

1.已知的#块(类型也就是#后面的16进制数字)
0×01–文件开始
0×02–标题
0×03–作者
0×04–年
0×05–月
0×06–日
0×07–小说类型
0×08–出版商
0×09–零售商
0×0b–内容长度
0×83–章节偏移
0×84–章节标题,正文
0×81–正文写入完毕
0×82–封面
0×87–PageOffset
0×0c–文件结束

2. 整数编码为littleEndian, 也就是低字节在前,高字节在后,相应的,所有的文本也都是Unicode16 LittleEndian编码的
3. 章节数据块(0×84)后面的第一个数据块是所有章节的标题,按照以下规则排列:
[第1章标题文本的字节长度(1byte)][第1章标题unicode文本][第2章标题文本的字节长度(1byte)][第2章标题unicode文本]…
4. 章节数据块(0×84)后面的第二个数据块及以后的数据块是正文文本数据,是用标准zlib算法压缩的
5. 似乎每个数据块的字节大小都在18K以内
6. 似乎正文中的换行(\r\n)都被替换成了unicode段分隔符\u2029,不知道是否跟制作工具有关
7. 封面图片的数据是未压缩的,也就是说直接把数据段复制出来保存成一个jpg文件就可以了

[......]

继续阅读