2009-12-06 20 views
8

私はCでハフマンアルゴリズムを実装しています。バイナリコードワードが得られるポイントまで基本機能を持っています。たとえば、abcdは100011000などのようになります。今質問は、圧縮ファイルにバイナリ形式でこのコードを書く方法です。私は通常、1と0のそれぞれが1つの文字になるので、圧縮がないので、それを通常書くと意味します。ビットフォームのファイルをC言語のファイルに書き込む

これらの1と0をビット形式で書き込む必要があります。もしそうならCで可能ですか?

+0

いいえ、それは可能ではありません。そして、この質問は欺瞞です。 –

+0

私は単にこのような状況でやる方法を尋ねていただけです。アスキーが目的を果たしていないので、単にコードを書きます。他の方法があるはずです。 – sfactor

+0

あなたは、エンコーディング関数でchar *の代わりにintを生成するか、文字列をそのビットシーケンスを表すintまたはlongに変換する関数を記述する必要があります。 –

答えて

16

収集ビットあなたがバイトを記入し、それを書くのに十分なビットを持ってまで...

例えば

int current_bit = 0; 
unsigned char bit_buffer; 

FILE *f; 

void WriteBit (int bit) 
{ 
    if (bit) 
    bit_buffer |= (1<<current_bit); 

    current_bit++; 
    if (current_bit == 8) 
    { 
    fwrite (&bit_buffer, 1, 1, f); 
    current_bit = 0; 
    bit_buffer = 0; 
    } 
} 

ビットの書き込みが完了したら、ビットバッファをフラッシュする必要があります。これを行うには、current_bitがゼロに等しくなるまでビットを書き込みます。

void Flush_Bits (void) 
{ 
    while (current_bit) 
    WriteBit (0); 
} 
+0

これを指摘してくれてありがとう、ありがとう...ファイルを終了するにはどうすればいいのですか?...私はこの場合自分でこれを行う必要があると考えています。 – sfactor

+0

上記のようにFlush_Bitsを呼び出すだけです。 –

+0

コードに問題があります:ビットが設定されている場合にのみシフトします。 '10000000'を出力したいとします。 1は決して最も重要なビット位置に到達しません。 –

関連する問題