ハフマン圧縮スキームに似た何かをしようとしているように聞こえますか? バイト単位 (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 バイトから次のバイトにオーバーフローする場合も処理する必要があります。