私はCでハフマンアルゴリズムを実装しています。バイナリコードワードが得られるポイントまで基本機能を持っています。たとえば、abcdは100011000などのようになります。今質問は、圧縮ファイルにバイナリ形式でこのコードを書く方法です。私は通常、1と0のそれぞれが1つの文字になるので、圧縮がないので、それを通常書くと意味します。ビットフォームのファイルをC言語のファイルに書き込む
これらの1と0をビット形式で書き込む必要があります。もしそうならCで可能ですか?
私はCでハフマンアルゴリズムを実装しています。バイナリコードワードが得られるポイントまで基本機能を持っています。たとえば、abcdは100011000などのようになります。今質問は、圧縮ファイルにバイナリ形式でこのコードを書く方法です。私は通常、1と0のそれぞれが1つの文字になるので、圧縮がないので、それを通常書くと意味します。ビットフォームのファイルをC言語のファイルに書き込む
これらの1と0をビット形式で書き込む必要があります。もしそうならCで可能ですか?
収集ビットあなたがバイトを記入し、それを書くのに十分なビットを持ってまで...
例えば
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);
}
これを指摘してくれてありがとう、ありがとう...ファイルを終了するにはどうすればいいのですか?...私はこの場合自分でこれを行う必要があると考えています。 – sfactor
上記のようにFlush_Bitsを呼び出すだけです。 –
コードに問題があります:ビットが設定されている場合にのみシフトします。 '10000000'を出力したいとします。 1は決して最も重要なビット位置に到達しません。 –
いいえ、それは可能ではありません。そして、この質問は欺瞞です。 –
私は単にこのような状況でやる方法を尋ねていただけです。アスキーが目的を果たしていないので、単にコードを書きます。他の方法があるはずです。 – sfactor
あなたは、エンコーディング関数でchar *の代わりにintを生成するか、文字列をそのビットシーケンスを表すintまたはlongに変換する関数を記述する必要があります。 –