-1

私のプログラムはハフマン コードをchar[8]変数に格納します。unsigned char変数に格納したい。私はそれを行いますが、次のコードを使用してファイルを抽出したときに機能しなかったため、正しく機能するとは思いません。

unsigned char bit2byte ( unsigned char bits[8] ) {
    unsigned char x = 0; 

    for ( int k = 0; k < 8; k++ ) {
        if ( bits[k] == '1' ) 
            x = x | 1;

        x <<= 1; 
    }

    return x; 
}
4

3 に答える 3

3

この行はどうですか:

if ( bits[k] == '1' ) 

配列はbitsビットを ASCII 文字またはデジタル値として保存しますか。

if ( bits[k] == 0x01 )

あなたはおそらくあなたの心を読むことができないために私に反対票を投じるでしょう...

于 2011-07-04T23:49:32.253 に答える
0

ハフマンは圧縮スキームであり、ハフマンでエンコードされたファイルを読みたい場合は、おそらくそれをデコード (つまり、解凍) する必要があります。

http://en.wikipedia.org/wiki/Huffman_coding

ハフマンでエンコードされたデータでは、各文字は可変ビット数として表されるため、各呼び出しで 1 バイトを返すことを期待して、ファイルの固定部分を渡すだけではファイルを処理できません。状態を維持する必要があります。各呼び出しで消費されるビット数と、次のバイトを抽出するためにビット ストリーム内のどこから処理を開始するか。

ハフマン データを正しくデコードするには、エンコーディング ツリーが必要です (ウィキペディアのリンクを参照)。このツリーは、ファイル内にも保存されている可能性が最も高いため、実際には、ファイルは次の 2 つの部分で構成される可能性が高くなります。(1) エンコーディング/デコードツリー、および(2)データ-ファイルに保存する方法は実装固有であるため、デコードを試みる前に最初にその仕様が必要になります。

お役に立てれば。

于 2011-07-05T01:20:11.320 に答える
-1

「うまくいかない」とはどういう意味かはわかりませんが、別の方法をとる必要があるかもしれません。

for (int k = 7; k >= 0; k--) {

他のすべては以前と同じです。

もちろん、8 ビットの情報だけを格納するために 8 バイトを使用する理由もわかりません。

于 2011-07-04T22:25:18.660 に答える