ChessBase Readerをダウンロードし、ProcMonで少し遊んでアーカイブを読み取り、データファイルを書き込む関数を見つけた後、IDAにすべてをロードして分析しました。データはハフマン符号化されています。
各データブロックの構造は次のとおりです。ハフマン圧縮はバイトではなくビットで機能するため、次の表の各サイズもビット単位であることに注意してください。たとえば、ブロック長は16ビットまたは2バイトです。
+ ------------------------- --------------------- + | || 16ビット-非圧縮ブロック長(len)|| | + ----------- + ---------------------------------- + | | ||繰り返し| 4ビット-エントリの長さ(n)|| 256 | ||時間+ ---------------------------------- + | | || 1つのエントリ| nビット-ツリーの左/右||バイトごと|このバイトの情報||(0-255)| || | | + ----------- + ---------------------------------- + | ||ハフマンでエンコードされたビットシーケンス。 ||の数ビットはどこにも保存されませんが、数値||シーケンスの数、これは数に等しい||出力バイトの、はブロック長(len)です|| | + ---------------------------------------------- +
このスキームで「foobar」という単語がコーディングされているとすると、次のようになります(文字のビット値を作成しました):
+ ---------------- + |||文字のハフマンコードは| + -------- + ------- + | | || o | 0 || f | 100 || b | 101 || a | 110 || r | 111 || | | + -------- + ------- +
これにより、foobarという単語が次のようにコード化されます。
100 0 0 101110111
。長さは6バイト、つまり16ビットで 0000 0000 0000 0110
です。
上記の表にフォーマットされた foobar
のビット配列は次のようになります
0000 0000 0000 0110(16ビット出力長).....バイト '\ 0'の配列インデックス0 .....バイト '\ 1'の配列インデックス1 .. .. ..0011バイト「a」(3ビット)の110配列インデックス97 0011101バイト「b」(3ビット)の配列インデックス98 ..... 0011バイト「f」(3ビット)の100配列インデックス102。 .... 00010バイト 'o'(1ビット)のアレイインデックス111 ..... 0011101バイト 'r'(3ビット)のアレイインデックス114 .....残りのビットコンボ-2551000 0 101 110 111 foobar text
実装は、コードテーブルからバイナリツリーを構築します。データを読み取るときは、ツリーのルートから開始します。各ビットは、次のビット値に応じて、ツリーを下って左または右に移動します。リーフに到達すると、対応するバイトが出力されます。これは、出力ストリームの長さに達するまで繰り返されます。
バイナリの関連関数は次のとおりです。
BECAA0
:アーカイブデータをデコードします。長さの16ビットを読み取ります。次に、デコーダークラス内のオフセット 080A
(ビット)と 0E10
(ビット長)でエンコードテーブルを2つの配列に読み取ります。この後、 BEC930
を呼び出してデータバイトをデコードします。
BEBF30
:1つのパラメータ(ビット数)は、入力配列からこの数のビットを取得します。関数の最後に、オフセット 1014
の単語にこれらのビットがあります。
BEBAD0
: 080Aの配列からツリーを構築します
および 0E10
BEC930
: BEBAD0
を呼び出してツリーを構築し、残りのビットを入力ストリーム。ビットごとにツリーを歩きます。リーフが見つかるとバイトを発行します。最後に、 BEBA90
を呼び出してツリーを破棄します。
BEBA90
:ノード自体である左右の子を削除して、ノードを再帰的に削除します。
必要に応じて、ライターのデバッグが簡単になるとは思いません。ファイルを読み取るため。圧縮には多くのロジックとデータ構造があり、「一方向」がどのように機能するかを知っていても、必ずしも逆方向に役立つとは限りません。この場合、幸いなことに、これはよく知られているアルゴリズムですが、アルゴリズムが不明な場合、解凍方法を知っているだけでは効果的に圧縮するのが非常に難しい場合があります。