At Fri, 17 Oct 2003 13:21:10 +0900,
Fujii Hironori wrote:
> 
> もしも、がんばる方がいらっしゃいましたら、

V3 の情報がどれだけ訳に立つかは分かりませんが、
以前書いたメモを流しておきます。

---
システムソフト電子辞典シリーズ

*.DIC ファイル

JIS X 4081 の 1 block は 2048 byte (0x800 byte) 。

概略だけ書くと、
0x8000バイト毎に切って、オフセット長12bit、文字列一致長4bitの
LZ77 で圧縮したものを連結してあります。

16 block 分が 32768 byte, 0x8000 byte

LZ77 とは、
「x 文字前より y 文字コピー。その次が文字 `z'。」
このような x, y, z の繰り返し。

 x: オフセット
 y: 文字列一致長



1バイトは8ビットとします。基本的にビッグエンディアン。
ファイル構造はヘッダ部、オフセット部、チャンク部の三部構成。

 * ヘッダ部

 64バイト

00-08: SSEDDATA
09-0e: 不明。バージョン?
0f-0f: 種類?
10-15: 不明
16-17: チャンク数 n_chunk
18-1b: num1 先頭ブロック番号
1c-1f: num2 終了ブロック番号
20-3f: 不明


 * オフセット部 

 n_chunk * 4 バイト

オフセットはファイルの先頭からチャンクの開始位置


 * チャンク部

 n_data * 3 + 5 バイト

00-02: ゼロ
03-04: データ数 n_data
05-05: ウィンドウの初期化文字

06-07: オフセット(12bit)と文字数(4bit)
08-08: 文字
...

o オフセット長は12bitだが、ウィンドウサイズは0xff0?
  → そのようです。

o ウィンドウは 0x00 での初期化でなく、05 にある文字で初期化?
  → そのようです。

o データ中に「2文字前より3文字コピー」といった感じのデータが含まれるが
  この場合ウィンドウをリングバッファで実装するか、しないかで変わってくる。
  → LZ77の基本的テクニックでした。
     「1文字前より10文字コピー」だってよし。

o 00-02 は n_data の上位?

o 圧縮を展開すると、すこしサイズが大きい。1byte大きい。
  展開アルゴリズムがおかしい?
  切り捨ててもいい?

---
藤井宏憲