CHM格式说明

翻译 2007年10月13日 23:06:00
        现在阅读电子小说成为了一种新时尚,这让每天能够上网,不愿意买书阅读的人有了一种新的网上时尚。网络上可读物的格式非常多,有在线、离线之分。对于按时间收费的用户来说,在线式不划算,因此保存到本地慢慢欣赏比较合适。而离线式的文档格式有DOC、PDF、CHM、EXE、TXT、超星等格式。超星有一段时间很火,后来好像也就不怎么样了。DOC有微软的Office支持,始终是不温不火。阅读的话一定要安装WORD,文件比较大。PDF尺寸比较小,要安装专用阅读器。EXE的容易嵌入病毒或木马。CHM一般。TXT的现在是最火,不管是MP3、MP4、手机等个人数码电子设备都支持TXT格式阅读。它的特点是格式简单、通用、个头不大。

        CHM帮助文件是什么?原来的软件大多数采用扩展名为HLP的帮助文件(WinHelp ),但随着互联网的发展,这种格式的帮助文件已经难以适应软件在线帮助的需要,以及更加人性化更加简单易于查看的需要,因此一种全新的帮助文件系统HTML Help由微软率先在Windows98中使用了。由于它是一个经过压缩的网页集合,不但减小了文件的体积,更利于用户从INTERNET上下载,并且还支持HTML、Ac-tiveX、Java、JScript、Visual Basic Scripting 和多种图像格式(.jpeg、.gif和.png 等),因此很快受到广大软件作者和软件用户的欢迎。电子书中有不少文件是CHM格式的。因此将CHM格式转为TXT格式,可以获得大量阅读材料。

CHM格式简介
CHM格式有一个初始化头,占38个字节,后面是header section和到正文的偏移量。加在一起,这些被称为文件头。
header section一共有两个section(有点像信息说明),一个是文件目录,另一个包含着文件长度和一些未知信息。
 
文件头
文件头包含初始化信息,格式如下:
0000:第一个双字为ITSF
0004:第二个双字为版本信息
0008:第三双字是文件头的总长度
000C:第四双字值为1
0010:第五双字是一个时间记录 (第一个字节是MSB,第二个字节是 fractional seconds(second byte),第三个字节可并不确定,第四个字节仅能知道其符号位是确定的。
0014:第六双字是windows语言ID标识
后面16个字节是两个连续的GUID,分别为
0018:{7C01FD10-7BAA-11D0-9E0C-00A0-C922-E6EC}
0028:{7C01FD11-7BAA-11D0-9E0C-00A0-C922-E6EC}
 
后面是header section的表,其中有两项,每项占16个字节,记录着从文件头开始的偏移量和section的长度,各占8个字节。
0000:从文件起始处开始的section偏移量
0008:section的长度
 
后面还有8个字节的信息,这些在版本2里是没有的。这个信息是附加头数据。
 
Header Section
header section 0:
0000:第一双字0x01fe(未知)
0004:第二双字0(未知)
0008:第三双字为文件大小
0010:第四双字0(未知)
0014:第五双字0(未知)
 
header section 1(目录列表)
chm文件的中心部分,文件目录和文件信息。它包含如下部分:
0000:第一个双字为ITSP,
0004:第二个双字为版本号为1,
0008:第三双字为目录头长度,
000C:第四双字为0a信息未知,
0010:第五双字值为0x1000,是目录块的大小,
0014:第六双字是quickref section的“密度”,一般是2
0018:第七双字是索引树的深度,1表示没有索引,2表示有一层的PMGI数据块。
001C:第八双字表示根索引的块号,如果没有索引为-1
0020:第九双字是第一个PMGL(listing)的块号
0024:第十双字是最后一个PMGL的块号
0028:第十一双字是-1(未知)
002C:第十二双字是目录块的块数
0030:第十三双字是windows语言ID标识
0034:从这里开始有16个字节的GUID{5D02926A-212E-11D0-9DF9-00A0C922E6EC}
0044:接着的双字是54(又一个长度)
0048:双字都为-1(未知)
004C:双字都为-1(未知)
0050:双字都为-1(未知)
 
列表块
文件头后就是目录块。目录块分为两种,一种是列表块(listing chunks),一种是索引块(index chunks)。如果只有一个列表块,则索引块被省略。
其中列表块的格式如下:
0000:开始是四个字节PMGL
0004:然后的四个字节是目录块尾部的空白区的长度或是quickref区域的长度
0008:第三双字总为0
000C:第四双字是前一个列表块的块号,如果这是第一个块,该值为-1
0010:第五双字是后一个列表块的块号,如果这是最后一块,该值为-1
0014:从这里开始是目录列表项,按文件名排序,并且大小写不分
 
quickref区是从数据块的后面向前写,每隔n个项出现一个quickref,且n的值为1+(1<<“密度”),其格式从后至前为。例如密度为2,n为5。
块长度-0002:第一个字:整个数据块中的入口数
块长度-0004:第二个字:从第0项到第n项之间的偏移量
块长度-0008:第三个字:从第0项到第2n项之间的偏移量
块长度-000C:第四个字:从第0项到第3n向之间的偏移量
以此类推
 
目录列表的每一项入口的格式如下:
BYTE:encint型名字长度
BYTEs:后面是UTF-8编码的名称
ENCINT:encint型正文段
ENCINT:encint型偏移量
ENCINT:encint型长度
其中偏移量是从解压缩之后的正文段的开始来计算的,同样长度也是表示解压缩之后的长度。
在目录中存在两种文件,用户数据文件和格式信息文件,格式信息文件以两个连续的冒号“::”开头,用户数据文件以“/”开头。
 
索引块
索引块的格式如下:
0000:前四个字节为PMGI
0004:后面四个字节是块尾部的quickref或是空白区的长度。
0008:从这里开始是目录索引项的开始,
 
quickref的格式和排列与列表块中相同。
 
每一个目录索引项的结构如下:
BYTE:encint型的名称长度
BYTEs:UFT-8编码的名称
ENCINT:以此名称开始的列表块的块号。
 
当有索引块的层次较多时,将不再存储数据块号而是存储下一层的索引号。
 
解释一下encint型变量的编码规则:
一种可变长度的整型变量,第一个字节只使用低7位,最高位为1表示该字节之后的下一字节的低7位要接在这7位的尾部组成一个数,这样通过移位相加的运算,直到遇到最高位为0的字节,可以组和成一个长度可调节的整数。
 
正文
在版本3中,正文一般紧跟着文件头,而且在文件头表之后有一个双字用来指定其位置。在版本2中,正文部分紧跟着文件头。所有第0段正文内容在目录中的位置都是相对那点来说的,其它的正文段都在content section 0中。
名称列表文件
放在content section 0和目录中的文件,文件名为"::DataSpace/NameList",其中包含着所有正文段的名称,其格式如下:
0000:第一个字:以字计数的文件长度
0002:第二个字:文件中的entry数
对于每一个entry格式为:
0000:第一个字:以字计数的名字长度,不包括最后的NULL结尾符
0002:以word 0表示所有entry的结束。
xxxx:字0
名称的编码类似于UFT-16。
段的名称目前为止只有两种,Uncompressed和MSCompressed,分别表示自解释文件和Microsoft LZX压缩算法压缩的文件。
section data
对于段号不为0的段,还有一个文件为::DataSpace/Storage/<Section Name>/Content,里面存放着该段的压缩信息,所以,当解析
非0段时,需要两步工作,第一步,取得第0段并将其解圧,取得段名,第二步才能利用段名找到相应的段
其余与格式相关的文件
::DataSpace/Storage/<SectionName>/ControlData
共0x20个字节,存储关于压缩的信息
0000:第一个双字为在“LZXC”串后的双字个数,在版本2中,此值必为6
0004:ASCII第二个双字为“LZXC”
0008:第三个双字为版本信息,必须大于2
000C:第四个双字为LZX reset interval(0x8000字大小的块中)
0010:第五个双字为窗口大小.
0014:第六个双字为缓存大小
0018:第七个双字为0,未知信息。
001C:第八个双字为0,未知信息。
::DataSpace/Storage/<SectionName>/SpanInfo)
存放着未解压的段的长度信息。
::DataSpace/Storage/<SectionName>/Transform/List
存放GUID列表用于解压缩
附录:压缩说明
这一段用LZX压缩,要进行解压缩,先要读取::DataSpace/Storage/<SectionName>/Transform/
 {7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTable,其格式如下:
0000:第一个双字为2,估计是版本信息
0004:第二个双字是reset table中的entry数
0008:第三个双字是8,每一个entry的大小
000C:第四个双字是表头长度
0010:16个字节的压缩前长度
0018:16个字节的压缩后长度
0020:16个字节的0x8000 block size for locations below
0028:16个字节的0
0030:16个字节的第一个非压缩数据块的边界在压缩数据块中的位置信息
 
现在你就已经了解了整个CHM文件格式。 

关于TXT转CHM的完整解决方案

为什么要转CHM? 有些书,TXT的资源很好找,而CHM的资源很难找(先不论PDF格式的,不过话说PDF格式的没有一个书签目录看起来也很难受)而CHM格式在左侧有一个目录结构,我最喜欢这个目...
  • middlekingt
  • middlekingt
  • 2013年02月05日 18:03
  • 15258

怎样生成开源项目源代码的CHM文档

目前开源项目越来越多,例如Linux、Android、OpenCV、PCL等等。这些项目代码规模非常大,文件多,要一个个查看费时费力,而且类、函数对象之间的调用关系难以直观分析。这里向大家介绍一种通过...
  • chenyusiyuan
  • chenyusiyuan
  • 2013年03月20日 14:34
  • 7529

将html版API文档转换成chm格式的API文档

将html版API文档转换成chm格式的API文档的方法
  • u012557538
  • u012557538
  • 2014年12月22日 22:51
  • 3721

C#扫雷游戏源码及开发文档和chm格式使用说明

  • 2010年01月03日 13:35
  • 1.46MB
  • 下载

RingSDK使用说明(CHM格式)

  • 2008年11月19日 15:03
  • 671KB
  • 下载

CHM格式转化器,制作软件说明文档专用

  • 2013年04月07日 08:46
  • 4.38MB
  • 下载

CHM文件格式说明(英文)_ar4ever

  • 2007年07月28日 19:49
  • 252KB
  • 下载

使用源码生成CHM格式的API文档

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 版本为1.2.3的shiro API chm个事故文档生成。 ...
  • shuyeshangdemayi
  • shuyeshangdemayi
  • 2016年06月20日 14:25
  • 885

自己动手制作chm格式开源文档

html格式的文档用着很不爽,1.页面的整洁度不行  2.没有索引功能 下面我就来介绍一款工具来快速将html文档转化为chm格式文档: 这里需要两款工具:1.htmlhelp.EXE  2.jd...
  • SOMECT
  • SOMECT
  • 2013年06月08日 14:17
  • 743

将html的api文档转换成chm格式

转自:http://www.cnblogs.com/shenliang123/archive/2012/04/23/2466441.html   我是看javamail看的很不爽,无奈不知道怎么转...
  • New_ChenXiaoHang
  • New_ChenXiaoHang
  • 2013年06月05日 17:09
  • 815
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CHM格式说明
举报原因:
原因补充:

(最多只允许输入30个字)