ハフマン エンコーディングを行っていますが、fwrite() を使用してエンコーディングを出力に書き込む方法がわかりません。
これらのエンコーディングがあるとしましょう:
Character A (65) gets an encoding of 101
Character B (66) gets an encoding of 1100111
ただし、これらのエンコーディングは整数として保存されるため、
101 actually has a decimal value of 5 which is saved in memory as 00000101
1100111 actually has a decimal value of 103 which is saved in memory as 01100111
したがって、fwrite() を使用してそれらを書き出す場合は、バッファを使用するとします。
int buff[4]
次のように始まります
buff[0] buff[1] buff[2] buff[3]
XXXXXXXX - XXXXXXXX - XXXXXXXX - XXXXXXXX
(X を使用して初期化されていないことを示します) なぜ 4 バイトを使用するのですか? 非常に長いエンコーディングを考慮する必要があるためです。27 ビット長のエンコーディングがある場合はどうなるでしょうか。これらのバイトの 3 つと 4 番目のバイトを少し埋める必要があります。
ここで、この一連の文字をエンコードして出力ファイルに書き込む必要があるとします。
「ABB」
まず、A をエンコードすると、buff[] は次のようになります。
buff[0] buff[1] buff[2] buff[3]
101XXXXX - XXXXXXXX - XXXXXXXX - XXXXXXXX
次に、B をエンコードする必要があるため、buff[] は次のようになります。
buff[0] buff[1] buff[2] buff[3]
10111001 - 11XXXXXX - XXXXXXXX - XXXXXXXX
ここで、buff[] の 1 バイトがいっぱいになったので、そのバイトをエンコードして、buff[] の他のスロットを下にシフトする必要があります。
fwrite(buff[0], 1, 1, fptOutput);
/* insert code to shift buff down */
したがって、バフは次のようになります。
buff[0] buff[1] buff[2] buff[3]
11XXXXXX - XXXXXXXX - XXXXXXXX - XXXXXXXX
次に、別の「B」をエンコードすると、buff[] は次のようになります。
buff[0] buff[1] buff[2] buff[3]
11110011 - 1XXXXXXX - XXXXXXXX - XXXXXXXX
次に、再度 fwrite() buff[0] を実行し、シフトを再度実行します。
しかし、エンコードするものが他にないため、残りのバイトを 0 で埋める必要があるため、バフは次のようになります。
buff[0] buff[1] buff[2] buff[3]
10000000 - XXXXXXXX - XXXXXXXX - XXXXXXXX
そして、その最後のバイトを書き込めば完了です。
問題は、それを体系的にプログラムする方法がまったくわからないことです。ビット操作を理解しています。たとえば、最初の「A」エンコーディングでは、「00000101」を左に 5 桁シフトして「101-----」にする必要があります。その手順は理解できますが、その後はわかりません。次のエンコーディングをどこにシフトするかを追跡する方法。
手動で行っている場合、必要に応じて各変数をシフトする方法を理解できますが、非常に長いファイル内の一連のエンコーディングごとに機能する一連の方程式を考え出す方法がわかりません.