日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

在线CHM阅读器(1)——CHM文件格式概述

發布時間:2023/12/25 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 在线CHM阅读器(1)——CHM文件格式概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前開源的WEBOS中有一個在線CHM閱讀器,本文將介紹如何開發一個功能類似的在線CHM閱讀器。

效果圖

相關技術

1.Structured Storage

Structured Storage provides file and data persistence in COM by handling a single file as a structured collection of objects known as storages and streams.

The purpose of Structured Storage is to reduce the performance penalties and overhead associated with storing separate objects in a single file. Structured Storage provides a solution by defining how to handle a single file entity as a structured collection of two types of objects—storages and streams—through a standard implementation called Compound Files. This enables the user to interact with, and manage, a compound file as if it were a single file rather than a nested hierarchy of separate objects.

關于Structured Storage請查閱MSDN,CHM文件本質上就是一個結構化存儲格式的文件,因此,如果要讀取CHM中的文件,需要知道Structured Storage的相關API。

2.ISAPI篩選器

ISAPI(Internet Server Application Programming Interface)作為一種可用來替代CGI的方法,是由微軟和Process軟件公司聯合提出的Web服務器上的API標準。ISAPI與Web服務器結合緊密,功能強大,能夠獲得大量的信息,因此利用ISAPI可以開發出靈活高效的Web服務器增強程序。實現CHM在線閱讀器(在不反編譯的情況下)需要使用ISAPI篩選器來實現URL重定向。

3.Lesktop

Lesktop是一款用于開發RIA網站的開源JS界面庫,Lesktop提供了一個功能強大的可視化開發工具幫助您快速的開發RIA網站。本文介紹的CHM在線閱讀器將使用Lesktop來開發前臺界面。

CHM文件格式

1.反編譯CHM文件

要閱讀CHM文件,首先就必須反編譯CHM文件,提取出其中的文件(網頁,圖片等),反編譯CHM文件需要用到WIN32 API的StgOpenStorage函數,.NET反編譯CHM文件的方法可閱讀這篇文章:

CHM Help File Extractor

2.#SYSTEM文件

反編譯CHM文件后,您可以在解壓出來的文件中看到這個名稱為#SYSTEM的文件,這個文件保存了一些關于CHM文件的信息,例如起始頁,標題等等。#SYSTEM是一個二進制文件,其格式也并不復雜,格式如下所示:

ID(2字節)+數據長度(2字節)+數據(字節數由數據長度決定)

#SYSTEM文件就是有多個以上這種數據構成,根據這個規律,可以讀取出所有ID對應的數據,并保存到一個Hashtable中,代碼如下:

private bool ReadSession(BinaryReader reader)
{
    if (reader.BaseStream.Position >= reader.BaseStream.Length) return false;

    UInt16 id = reader.ReadUInt16();
    UInt16 count = reader.ReadUInt16();
    if (count + reader.BaseStream.Position <= reader.BaseStream.Length)
    {
        if (count > 0)
        {
            _session[id] = reader.ReadBytes(count);
        }
        return true;
    }
    else
    {
        return false;
    }
}

public ChmInfo(Stream stream)
{
    BinaryReader reader = new BinaryReader(stream);

    while (ReadSession(reader)) ;
}

目前可以確定的ID和數據對應關系如下:

0x0002 - 起始頁的路徑

0x0003 - 標題

0x0004 - 語言

根據這個對應關系,就可以讀取出CHM文件的標題,起始頁等。

3.目錄文件(*.hhc)

如果CHM帶有目錄的話,反編譯CHM文件后,您可以在解壓出來的文件中看到一個擴展名為HHC的文件,這個文件保存了CHM的目錄結構。

上圖是一個HHC文件的內容,大概的規律是,每一個<LI><OBJECT>…<OBJECT>對應著目錄樹中的一個節點,<OBJECT>…<OBJECT>中的參數記錄著該節點的屬性(對應的頁面,名稱等)。如果這個節點有子節點的話,那么<LI>后面會緊跟著一個<UL></UL>,<UL>里面所有的節點都是其子節點。

上文已簡單的介紹了如何反編譯CHM的文件格式以及關鍵文件的格式,在下一篇文章中,將介紹如何處理目錄文件(*.hhc文件)以及如何利用ISAPI篩選器在沒有反編譯出CHM內部文件的情況下實現一個在線CHM閱讀器。

盡管目前這個系列還沒有完成,但是您可以先下載源代碼預覽一下這個在線CHM閱讀器:

在線CHM閱讀器源代碼(注意:該CHM閱讀器需要用到ISAPI篩選器,請仔細閱讀部署須知)

如果您有任何問題,可以通過WebIM與我聯系。

總結

以上是生活随笔為你收集整理的在线CHM阅读器(1)——CHM文件格式概述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。