zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【caffe】epoch,[batch_size],iteration的含义
    OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)
    OAuth2.0学习(1-5)授权方式2-简化模式(implicit grant type)
    OAuth2.0学习(1-4)授权方式1-授权码模式(authorization code)
    OAuth2.0学习(1-3)OAuth2.0的参与者和流程
    OAuth2.0学习(1-1)OAuth2.0是什么?
    nodejs(1-1)
    HTTP协议扫盲(一)HTTP协议的基本概念和通讯原理
    MySql入门(2-2)创建数据库
    SpringCloud的注解:EnableEurekaClient vs EnableDiscoveryClient
  • 原文地址:https://www.cnblogs.com/tangZH/p/11176995.html
Copyright © 2011-2022 走看看