UMD是一种常用的电子书格式,本文只对文本类型的格式进行解析,动漫格式不做涉及。本文是搜集网络上关于UMD文件的资料并进行整理而成的,其中有些信息还不完整,可能还有的信息没有提到。这不是一本大全,仅仅是对一些常见块的分析。
作者:Dandelion <[email protected]>
日期:2010/8/22
免责声明
本文档仅做学习交流之用,您可以在不修改文档的前提下任意分发该文档,对于使用文中内容发生的侵权行为及对您造成的损失,本人将不承担任何责任!
概要介绍
UMD文件有三种格式类型,一种叫纯文本格式,一种叫漫画&写真集格式,以及连环画(文字+图画)。本文只涉及纯文本格式的UMD,后面将直接使用UMD指代这类格式的文件。
UMD 文件总体上是由一组连续的块组成的,每一块按照约定的顺序先后排列在一起构成了UMD文件的结构。根据块的职责,我将其分成两类:功能块和数据块。有的功 能块自身就可以完全的描述信息,而有的一些由于信息量大,特别地将数据放在别处(即数据块),如正文、章节偏移和章节标题,它们使用一个功能块和若干个数 据块,通常数据块都紧接在相应的功能块之后出现。
下表列出了已知的块标识:
块标识 |
描述 |
参数定义 |
0x01 |
umd文件头 |
DCTS_CMD_ID_VERSION |
0x02 |
文件标题 |
DCTS_CMD_ID_TITLE |
0x03 |
作者 |
DCTS_CMD_ID_AUTHOR |
0x04 |
年 |
DCTS_CMD_ID_YEAR |
0x05 |
月 |
DCTS_CMD_ID_MONTH |
0x06 |
日 |
DCTS_CMD_ID_DAY |
0x07 |
小说类型 |
DCTS_CMD_ID_GENDER |
0x08 |
出版商 |
DCTS_CMD_ID_PUBLISHER |
0x09 |
零售商 |
DCTS_CMD_ID_VENDOR |
0x0B |
内容长度 |
DCTS_CMD_ID_FILE_LENGTH |
0x0C |
文件结束 |
DCTS_CMD_ID_FIXED_LEN |
0x81 |
正文 |
DCTS_CMD_ID_REF_CONTENT |
0x82 |
封面(jpg) |
DCTS_CMD_ID_COVER_PAGE |
0x83 |
章节偏移 |
DCTS_CMD_ID_CHAP_OFF |
0x84 |
章节标题,正文 |
DCTS_CMD_ID_CHAP_STR |
0x87 |
页面偏移(Page Offset) |
DCTS_CMD_ID_PAGE_OFFSET |
0x0A |
CONTENT ID |
DCTS_CMD_ID_CONTENT_ID |
0xF0 |
CDS KEY |
DCTS_CMD_ID_CDS_KEY |
0xF1 |
许可证(LICENCE KEY) |
DCTS_CMD_ID_LICENSE_KEY |
表-1 所有已知的块标识。黄色背景的项目说明它们的数据存储在后接数据块中。
之所以说是“已知的块标识”,主要是因为本人没有见过真正UMD的规范(似乎格式并未公布),这也是写本文的一个原因。上表中的信息及本文中绝大多数的信息都来源于网络上许多网友的劳动成果。
下面来看看UMD文件中的2类块结构
格式 |
大小(字节) |
描述 |
# |
1 |
指示这是一个功能块(0x23) |
Category |
2 |
块标识(见表1) |
Unknown |
1 |
未知,可能的值有0、1 |
Length |
1 |
整个功能块的长度(字节数) |
Content |
n |
功 能块的内容。一般是字符型的数据,并且以UNICODE编码存储,不带字符串结尾符0。Content所占用的字节数加上前面各字段的大小(前面共有5字 节)即为Length。如果此功能块后接一个数据块的话,Content存放的不是实际的内容,而是一个4字节的数,它引用着一个数据块,该数据块头部也 会包含同样的4个字节来标识自己。 |
表-2 功能块结构:
格式 |
大小(字节) |
描述 |
$ |
1 |
指示这是一个数据块(0x24) |
RandVal |
4 |
一个数据块标识,与对应功能块中的Content相同。注意正文数据块有所不同,后面将提到。 |
Length |
4 |
整个数据块的长度(字节数) |
Content |
N |
实际的数据,一般都很大。如正文的内容实际上划分为了很多块,分别放入了不同的数据块中。同样当Content存储的是字符串时,编码依然是UNICODE。Content占用字节数加上前面字段的大小(前面共有9字节)即为Length。 |
表-3 数据块结构
如上所示,功能块与数据块都有着各自的格式,UMD中的块都遵循这两种格式之一。尽管大体上简单明了,由于Content中实际存储的数据不同,其Content中的结构也有所不同。
下面将我将列出常用的Content格式。
先说功能块中的Content,主要分3类:
其 一、块标识为0x01的功能块,其Length为8,Content长度为3(由8-5计算得出)。3个字节中第一个字节标识出了该UMD文件的类型 (1-文本,2-漫画),另2个字节我不知有何意义,网络上有注释为:short random1.Next(0×401, 0x7fff) % 0xffff //PGKSeed,不过我还没发现有什么用处,就当随机数扔掉好了。
其二、包含基本属性的一些功能块,它们在Content中存储的是字符串(不含结尾符)。字符编码为Unicode16 LittleEndian。
其三、带有数据块的功能块。它们后面都紧跟着一个数据块,Content最后为4字节随机数,随后的数据块也有着同样的4字节随机数保存在RandVal中。Content的长度可能大于4字节,因为可以在Content内加入其他的一些数据。
块标识 |
描述 |
Content结构 |
字段大小 |
字段描述 |
共计 |
0x01 |
UMD文件版本 |
Flag |
1 |
UMD文件类型(1-文本,2-漫画) |
3 |
Random |
2 |
随机数 |
|||
0x02 ~ 0x09 |
UMD基本属性 |
Content |
N |
UNICODE文本 |
N |
0x0a |
CID |
Content |
N |
数据 |
N |
0x0b |
内容长度 |
Length |
4 |
内容长度 |
4 |
0x0c |
UMD文件结束 |
Length |
4 |
整个文件长度 |
4 |
0x81 |
正文结束 |
BlockRandom |
4 |
指向正文索引数据块的RandVal |
4 |
0x82 |
封面 |
Flag |
1 |
指示图片文件类型。1-JPG |
5 |
BlockRandom |
4 |
指向图像数据块的RandVal |
|||
0x83 |
章节偏移 |
BlockRandom |
4 |
指向章节偏移数据块的RandVal |
4 |
0x84 |
章节标题 |
BlockRandom |
4 |
指向章节标题数据块的RandVal |
4 |
0x87 |
页面偏移 |
fontSize |
1 |
字体大小 |
6 |
screenWidth |
1 |
屏幕宽度 |
|||
BlockRandom |
4 |
指向一个页面偏移数据块 |
|||
0xF0 |
CDS Key |
Content |
/ |
未知 |
/ |
0xF1 |
Licence Key |
LicenceKey |
16 |
16字节空数据 |
16 |
表-4 各功能块的Content格式