システムソフト電子辞典シリーズのファイル形式 *.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大きい。 展開アルゴリズムがおかしい? 切り捨ててもいい? → 切り捨てでいいみたい → Ver.2 では 23 byte も大きくなるチャンクもあるらしい。