7

Cを使用してビットストリームにデータを書き込むことを考えています。2つの方法が思い浮かびます。1 つは、可変ビット長のシンボルを連続したビット シーケンスに連結することですが、この方法では、私のデコーダーはおそらく、これらのシンボルをこの連続したビット ストリームから分離するのに苦労するでしょう。もう 1 つの方法は、どのシンボルに対して同量のビットを分配することです。この方法では、デコーダーは元のデータを簡単に復元できますが、シンボルが異なる値を持ち、ビット ストリームに多くのビットが含まれるため、ビットの無駄が生じる可能性があります。ゼロ(私が推測するこの無駄なビット)。

私が何をすべきかヒントはありますか?

私はプログラミングが初めてです。どんな助けでも大歓迎です。

4

1 に答える 1

3

ハフマン圧縮スキームに似た何かをしようとしているように聞こえますか? バイト単位 (char) に移動し、最後のシンボルを読み取ったバイト内のオフセットを追跡します。

あなたのシンボルのどれもcharより大きくないと仮定します。次のようになります。

struct bitstream {
   char *data;
   int data_size;           // size of 'data' array
   int last_bit_offset;     // last bit in the stream 

   int current_data_offset; // position in 'data', i.e. data[current_data_offset] is current reading/writing byte
   int current_bit_offset;  // which bit we are currently reading/writing
}

char decodeNextSymbol(bitstream *bs) {

}

int encodeNextSymbol(bitstream *bs, char symbol) {

}

decodeNextSymbol と encodeNextSymbol のマッチング コードでは、C のビット演算 ('&' (ビット論理積) と '|' (ビット論理和) など) を使用する必要があります。次に、すべてのシンボルのリストを作成します。たとえば、シンボルの 1 つが '101' の場合、ストリームが '1011101' の場合、最初の '101' に一致し、引き続き一致します残りのストリーム '1101' シンボル値が 1 バイトから次のバイトにオーバーフローする場合も処理する必要があります。

于 2012-07-17T00:08:12.380 に答える