文 件 格 式 分 析 技 术 讲 座
这 种 文 件 早 在 很 多 年 前 的 浩 瀚 光 盘 图 书 馆 上 就 出 现 过 , 不 知 是 谁 设 计 的 格 式 , 压 缩 率 还 是 比 较 高 的 , 比 单 用 LZW 的 gif 或 run length 的 PCX 压 缩 率 都 要 好 。因 为 他 的 压 缩 方 法 比 较 适 于 二 值 图 象 , 一 般 来 说 文 件 的 大 小 只 是 gif 文 件 的 三 分 之 一 。
我 分 析 了 浩 瀚 光 盘 的 随 盘 阅 读 程 序 , 对 文 件 的 解 码 和 显 示 在 一 个 叫 做 revv.exe 的 程 序 中 进 行 。 剩 下 的 就 是 s-ice 的 技 术 活 了 , 经 过 一 番 挣 扎 , ( 两 天 ), 我 成 功 地 写 出 了 自 己 的 解 码 程 序 。
下 面 简 要 地 介 绍 一 下 该 文 件 格 式 。
头 三 个 字 节 为 48h 48h 01h, 应 该 是 文 件 标 识 符 (magic number), 我 才 疏 学 浅 , 不 知 道 这 是 什 么 格 式 的 文 件 标 识 。
后 面 35 byte 为 文 件 头 ,
03h 图 象 宽
05h 图 象 高
以 后 的 都 是 0
图 象 行 内 采 用 游 码 (run length) 压 缩 , 行 间 游 码 有 差 值 压 缩。 38h 开 始 文 件 主 体 , 要 把 他 当 作 一 个 bit stream. 在 这 个 bit stream 里 , 所 有 数 据 都 采 用 huffman 编 码 。共 有 三 种 不 同 huffman 编 码 。 全 部 都 硬 编 码 在 程 序 中 ,没 有 码 表 可 查 。数 据 标 识 的 huffman 树 比 较 短 , 最 长 只 有 7 位 , 很 容 易 就 可 以 分 析 出 来 。可 怕 的 是 游 码 的 所 有 数 据 采 用 两 种 不 同 的 huffman 编 码 ( 起 始 位 置 和终 止 位 置 采 用 不 同 的 编 码 ) 最 大 码 长 可 以 有 十 二 三 位 , 全 部 硬 编 码 在 程 序 中 ,人 工 分 析 太 费 时 间 了 , 不 值 得 。
为 了 分 析 出 它 的 huffman 编 码 , 我 只 好 编 了 一 个 反 编 译 程 序 自 动 跟 踪 程 序 流 程 , 并 产 生 相 应 C 代 码 , 好 在 程 序 里 的 huffman 解 码 程 序 段 写 得 比 较 规 范 , 因 此 我 的 反 编 译 程 序 也 不 是 太 长 。
更 详 细 的 图 象 解 码 细 节 , 大 家 可 以 参 考 我 的 原 码 , 在 示 范 程 序 里 我 把 一 个 该 格 式 的 文 件 转 为 了 GIF 格 式 。