CHM 究竟是什么
.chm 是一个小型文件系统,微软称之为 ITSS:一个文件头、一份条目目录,以及一到两个内容区段——区段 0 原样存储,区段 1 用 LZX 压缩。里面装的是普通的 HTML 页面、样式表和图片,另外还有几个以 # 或 $ 开头的元数据流。
其中两个流在这里很关键。#SYSTEM 记录了帮助文件的标题和默认主题——查看器应当最先打开的那一页。没有它,阅读器只能靠猜,而按字母顺序猜,通常会猜到一份样式表上。.hhc 文件则是目录树,写成 HTML 站点地图的形式:嵌套的 <UL> 和 <LI>,里面放着 <OBJECT type="text/sitemap"> 条目。
真实的 .hhc 文件以格式混乱著称——到处是未闭合的列表项——所以这里用浏览器自带的 HTML 解析器来解析,它对这类错误的容错方式与当年的帮助查看器一致。换成 XML 解析器,只会直接拒绝这个文件。
阅读一个页面
每个页面的样式表和图片都会相对该页面在帮助文件中的路径进行解析,并替换为 CHM 自身的字节。主题之间的链接可以正常工作:页面显示在一个同源但没有 allow-scripts 的 iframe 中,因此其中任何内容都无法执行,而工具本身可以拦截点击并跳转到链接的主题。指向公网的链接不会被跟随,注入的 default-src 'none' 策略也保证它不会被意外请求。
关于压缩,实话实说
本工具会报告该文件使用的压缩方式:LZX,以及它的窗口大小和重置块数量;如果所有内容都在存储区段,则显示为无压缩。
这里的 LZX 解码器是依据 [MS-PATCH] 规范和 libmspack 的 lzxd.c 编写的。它的位流读取、规范 Huffman 解码、未压缩块和 x86 过滤器都有单元测试覆盖。但它的 verbatim 和 aligned 块解码从未在微软自家压缩器产生的文件上运行过,因为当时没有可离线测试的语料。
因此,如果某个页面解压失败,本工具会显示具体错误并拒绝渲染任何内容。它不会把恢复出的字节放到屏幕上。看起来像页面的乱码比一次诚实的失败更糟,因为你分辨不出来。如果真实的帮助文件在这里失败了,值得反馈——那是我们的问题。
还可以看到
每个页面的大小及其所在区段、生成该文件的编译器,以及 ITSS 目录的细节。如果想把文件取出来而不是阅读,请使用 CHM 提取器。
隐私
帮助文件在你的浏览器中打开,绝不上传。
Tiny Online Tools







