0

ハフマンアルゴリズムを使用してtxtファイルを圧縮/解凍するプログラムを作成する必要があります

私はそれを書きましたが、バッファサイズよりも文字数が少ないファイルではうまく機能しますが、文字数が多いファイルでは機能しません。

私の問題は、圧縮バッファーと解凍バッファーをインターフェースすることです。

そのため、圧縮によって書き込まれたバイト数 (ツリーを通過する 1 と 0 を含む) が、解凍によって読み取られたバイト数と異なる場合、それは機能しません。たとえば、圧縮のバッファーが 200 を書き込む場合、正確に 200 バイトを読み取るには解凍のバッファーが必要です。

解凍のサイズを 200 に設定すると、どこかで圧縮が 200 を書き込み、他の時間は 200 未満またはそれ以上になります。

毎回圧縮によって書き込まれたバイト数を追跡​​し、それを解凍部分に送信する方法を何か提案できますか?

4

2 に答える 2

2

ストリームの終わりを「追跡」する一般的な方法は、この用途専用の N+1 の「EOF」記号を追加することです。このように、「サイズ」カウンターを維持する必要はありません。

于 2011-12-12T09:04:53.487 に答える
0

バッファーは使用しませんでした。ファイルのヘッダーに、コードの長さとコード自体を書き留めます。したがって、ファイルを解凍する場合、最初にヘッダーからコード長とコードを読み取ります (ヘッダーに数バイトを入れて、ファイルの正確性を確認することもできます: たとえば XXY です。したがって、ファイルがこれらのバイトで始まらない場合、ファイルは破損します)。 )。コードの長さとコードを読み取った後、残りのデータをデコードします。次の方法でデコードできます。

int data=0,dataLength=0;
while (input.read((char*)&sign, sizeof sign)) {     
    data = (data << 8) + sign;
    dataLength += 8;
    for (int i=0; i<256; i++) {
        if (dataLengthFromHeader[i]==0)
            continue;
        if (dataLength>=dataLengthFromHeader[i] && codesFromHeader[i] == data >> (dataLength-dataLengthFromHeader[i])) {
            unsigned char code = i;
            izlaz.write((char*)&code, sizeof code);
            dataLength -= dataLengthFromHeader[i];
            data = data - (codesFromHeader[i] << dataLength);
            if (dataLength==0) break;
                i=0;
        }
    }
}
于 2011-12-11T03:34:03.180 に答える