CHM格式
转载请标明出处:https://www.cnblogs.com/tangZH/p/11176995.html
更多精彩文章:http://77blogs.com/?p=283
CHM格式为CHM头,CHM头节,内容三部分组成。
总体格式图:

初始化头包含了CHM的相关信息。格式如下:
0000:char [4]'ITSF'
0004:DWORD 3(版本号)
0008:DWORD 文件头总长度,包括标题节表和
以下数据。
000C:DWORD 1(未知)
0010:DWORD 时间戳。
被认为是一个大端的DWORD,它似乎包含
秒(MSB)和小数秒(第二个字节)。
第三个和第四个字节可能包含更多的小数
位。最后一个字节中的4个最低有效位是
不变。
0014:DWORD 语言代码:英文 0X0409,简体中文:0X0804
0018:GUID {7C01FD10-7BAA-11D0-9E0C-00A0-C922-E6EC}
0028:GUID {7C01FD11-7BAA-11D0-9E0C-00A0-C922-E6EC}
头节记录。它是2个条目,每个条目的长度为10个字节,具有以下格式:
0000:QWORD 头节的偏移量
0008:QWORD 头节的长度
这两个头节分别指向头节0和头节1,根据这两个头节的偏移量便可以读到两个头节。
内容节偏移。在版本2文件中,此数据不存在,因为内容部分紧跟在目录之后:
0000:QWORD 内容节的偏移量
头节0。此部分包含文件的总大小,而不是其他内容。
0000:DWORD 0X01FE(未知)
0004:DWORD 0(未知)
0008:QWORD 文件大小
0010:DWORD 0(未知)
0014:DWORD 0(未知)
头节1。.chm文件的核心部分:它包含的文件和信息的目录。
目录头:
0000:char [4]'ITSP'
0004:DWORD 版本号1
0008:DWORD 目录头的长度
000C:DWORD 0X0a(未知)
0010:DWORD 0X1000目录块大小
0014:DWORD 快速引用块密度,通常为2。
0018:DWORD 索引树的深度
1:没有索引,2:一层索引,以此类推。
001C:DWORD 根索引块的块号,如果没有则为-1
(尽管至少有一个文件有0,尽管没有
index chunk,可能是个bug。)
0020:DWORD 第一个PMGL(列表)块的块号
0024:DWORD 最后一个PMGL(列表)块的块号
0028:DWORD -1(未知)
002C:DWORD 目录块数(总计)
0030:DWORD Windows语言ID
0034:GUID {5D02926A-212E-11D0-9DF9-00A0C922E6EC}
0044:DWORD 0X54(这又是长度),同0X1000
0048:DWORD -1(未知)
004C:DWORD -1(未知)
0050:DWORD -1(未知)
目录头之后紧跟着目录块,有两种目录块:列表块和索引块,如果只有一个列表快,那么将没有索引块。
列表块:
0000:char [4]'PMGL'
0004:DWORD 结尾处的自由空间和/或quickref区域的长度目录块
0008:DWORD 始终为0。
000C:DWORD 读取时上一个列表块的块号
顺序目录(如果这是第一个列表块,则为-1)
0010:DWORD 读取时下一个列表块的块号
顺序目录(如果这是最后一个列表块,则为-1)
0014:目录列表条目(到quickref区域)排序方式根据文件名; 排序不区分大小写。
quickref区域是从块的末尾向后写入。对于文件中的每n个条目存在一个quickref条目,其中n被计算为1 +(1 << quickref density)。因此,对于密度= 2,n = 5。
其格式从后到前为:
Chunklen-0002:整个数据块中的项数
Chunklen-0004:从0项到n项之间的偏移量
Chunklen-0006:从0项到2n项之间的偏移量
......
目录列表条目的格式如下:
ENCINT:名字长度
UTF-8:编码的名称(UTF-8编码)
ENCINT:内容部分
ENCINT:偏移量
ENCINT:长度
偏移量是从文件解压缩之后的正文段开始计算的。长度也指解压后的长度。
目录中表示的文件有两种:用户数据和格式相关文件。与格式相关的文件具有以“::”开头的名称,用户数据文件的名称以“/”开头。
索引块:
0000:char [4]'PMGI'
0004:DWORD 目录块末尾的quickref / free(空余)区域的长度
0008:目录索引项
PMGI中的quickref区域与PMGL中的相同,当索引块的层次较高时,将不再存储数据块号而是存储下一层的索引号。
目录索引项的格式如下:
ENCINT:名字长度
UTF-8:名称(UTF-8编码)
ENCINT:以此名称开始的列表块的块号

内容:
在版本3中,内容通常紧跟在文件头之后,并且位于文件头表之后的DWORD指示的位置。在版本2中,内容紧跟在文件头之后。目录中的所有内容部分0位置都与该点相关。其他内容部分存储在内容部分0中。而且所有此文件夹中的正文部分的第0段都放在这个位置上。其他的正文段都在这个正文段里面。
名单列表文件
在内容部分0和目录中存在名为“:: DataSpace / NameList”的文件。此文件包含所有内容部分的名称。格式如下:
0000:WORD 文件长度,用文字表示
0002:WORD 文件中的条目数 每个条目:
0000:WORD 单词中的名称长度,不包括终止null
0002:WORD 。以0表示所有entry的结束。名称的编码类似于UFT-16。 段的名称目前为止只有两种,Uncompressed和MSCompressed,分别表示未压缩文件和Microsoft LZX压缩算法压缩的文件。
xxxx:WORD 0
Section_data:
对于段落编号不为0的段落,还有另一个文件:DataSpace / Storage / <Section_Name> / Content,它存储段落的压缩信息。 因此,在解析非零段落时,需要两个步骤。 第一步是获取第,并获取段落名称。 第二步是使用段落名称查找相应的段落。
其余与格式相关的文件: ::DataSpace/Storage/<SectionName>/ControlData
共0x20个字节,存储关于压缩的信息:


参考链接:
https://wenku.baidu.com/view/c2f81e21aaea998fcc220e22.html?pn=1
http://www.pythonclub.org/python-files/chm-format
CHM格式的更多相关文章
- <<< chm格式文件打不开及一些问题
		
CHM 意为 Compiled HTML.以CHM为扩展名的文件图标通常为一个带问号的文档图标,表示帮助文档,是 Microsoft 自 Windows 98 以来提供的一种帮助文档格式的文件,用于替 ...
 - Ubuntu 14 如何打开 .chm格式文档?
		
好多手册是.chm格式,Ubuntu是需要安装第三方软件才能打开.chm格式文档,操作方式如下: 到“软件中心” -> 搜索“xchm”,并安装 -> 右键某个.chm文档,选择“属性” ...
 - chm格式文件能打开,但看不到内容问题
		
是chm格式的能打开文件,也能看到左边的目录信息,但是无法显示右面的具体内容.报错:无法显示网页.错误页面的url是:res://C:WINDOWSsystem32shdoclc.dll/dnserr ...
 - 制作chm格式的帮助文档
		
学习java的人都用过jdk帮助文档,借助工具我们也可以自己生成chm格式的帮助文档, 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/2 ...
 - (转)chm格式的电子书打开是空白的解决办法
		
当我们从网络上下载chm格式的电子书到本地后,打开就发现chm格式的电子书右边的目录是正常的,但是chm格式的电子书内容部分却是空白的情况,很多时候我们都以为是中毒了,但是用杀毒软件却杀不出来,其实很 ...
 - Struts2 API的chm格式帮助文档制作教程
		
Struts2 API的chm格式帮助文档制作教程 在SSH三个框架中,Struts2的API文档是最难做的,这里所说的格式是chm格式的,chm的格式很方便,Hibernate API文档和Spri ...
 - 怎样简单的制作一个CHM格式的帮助文档?
		
http://jingyan.baidu.com/article/d8072ac446eb7bec95cefd0e.html 怎么制作CHM格式电子书 http://jingyan.baidu.com ...
 - [shiro学习笔记]第四节 使用源代码生成Shiro的CHM格式的API文档
		
版本为1.2.3的shiro API chm个事故文档生成. 获取shiro源代码 编译生成API文档 转换成chm格式 API 获取shiro源代码 shiro官网: http://shiro.ap ...
 - [shiro学习笔记]第四节 使用源码生成Shiro的CHM格式的API文档
		
版本号为1.2.3的shiro API chm个事故文档生成. 获取shiro源码 编译生成API文档 转换成chm格式 API 获取shiro源码 shiro官网: http://shiro.apa ...
 - 在windows 下将  chm 格式的文件 转换成 html 的文件
		
有时我们可能需要将 chm 格式的文件 转换成 html 格式的网页文件,这时,如果你使用的是 windows 操作系统,那就可以用 windows 操作系统自带的反编译工具来完成这项任务,具体步骤: ...
 
随机推荐
- 创业游戏模拟器 Startup 游戏试玩
			
买的正版游戏,还在beta阶段.因为对这种经营类的游戏挺感兴趣,结合自己也是做这个行当的.算是一次性通关了吧.我来评价一下这个游戏.足足玩了有5个多小时.从1级玩到15级.解锁了所有的内容.员工从1个 ...
 - PHP/JS中获取当前页面的完整URL
			
javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 php实现 PHP实现 #测试网址: http://localhos ...
 - is和==的区别以及编码和解码
			
一.is和==的区别 python中对象包含的三个基本要素分别是:id(身份标识),type(数据类型),value(值) is和==都是对对象进行比较判断的,但对对象比较判断的内容不同. ★==是p ...
 - HTML连载7-表单练习
			
昨天因为晚上有事情,未更新,但是今天中午发也不晚,因为是同一天只是时间早晚而已,因此今日傍晚还将更新一次,废话不多说. 1.表单的综合练习,我们要创建一个综合的注册页面.运用到我们前面所学的所有知识. ...
 - 3013C语言_输入输出
			
第三章 输入输出 3.1输入输出概念及其实现 (1)数据从计算机内部向外部输出设备(如显示器.打印机等)输送的操作称为 “输出”,数据从计算机外部向输入设备(如键盘.鼠标.扫描仪等)送入的操作称为 “ ...
 - kubernetes实战篇之创建密钥自动拉取私服镜像
			
系列目录 前面我们讲解了如何搭建nexus服务器,以及如何使用nexus搭建docker私有镜像仓库,示例中我们都是手动docker login登陆私服,然后通过命令拉取镜像然后运行容器.然而这种做法 ...
 - 面试还不知道BeanFactory和ApplicationContext的区别?
			
接口 BeanFactory 和 ApplicationContext 都是用来从容器中获取 Spring beans 的,但是,他们二者有很大不同 我看到过很多问 BeanFactory 和 App ...
 - 【面试】MySQL 中NULL和空值的区别?
			
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那 ...
 - laravel中的构造函数依赖注入理解
			
laravel中的自动依赖注入是非常强大的,刚开始会疑惑为什么只要在构造函数中传入一个强制类型的变量(就是参数有类型限制)过去就行了? 通过查看源码即查阅资料发现其实这其中有一个php技术,就是反射技 ...
 - Mac上使用brew update会卡住的问题
			
Mac上使用brew update会卡住的问题 brew默认的源是Github,会非常慢,建议换为国内的源.推荐中科大的镜像源,比较全面. 解决方案 Homebrew Homebrew源代码仓库 替换 ...