聽起來像你試圖做類似霍夫曼壓縮計劃的東西?我只需逐字節(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位運算( '&'(按位AND),和 '|'(按位OR)比如我。然後會列出我所有的符號,從最短的開始,然後做一個匹配最短符號的while循環,例如,如果其中一個符號是'101',那麼如果流是'1011101' ,它將匹配第一個'101'並且將繼續匹配'1101'流的其餘部分。您還需要處理符號值從一個字節溢出到下一個字節的情況。
這裏是我對類似的答案問題在這裏:http:// stac koverflow.com/questions/11253123/how-can-i-print-a-bit-instead-of-byte-in-a-file/11253310#11253310 – 2012-07-16 22:31:49
通常的方法是打包位,但這需要邏輯知道另一邊的位數。您可能會逐個解碼,以瞭解您何時到達符號的末尾。 – 2012-07-16 22:33:18
你的問題涉及到編碼領域。霍夫曼編碼,如下所述,是一種選擇。但也有其他的,因爲霍夫曼編碼不是唯一的(但它肯定是最受歡迎的)。請參閱Moffat和Turpin的書「Compression and Coding Algorithms」。大多數壓縮書都有關於編碼的內容。本書着重於編碼。在「硬性時間分離」方面,您需要一個無前綴的代碼 - 沒有代碼是任何其他的前綴。 – Ray 2012-08-07 03:42:37