2012-07-16 34 views
7

我正在考慮使用C將一些數據寫入比特流。有兩種方法可以記住。一種方法是將可變比特長度的符號連接成一個連續的比特序列,但這樣我的解碼器很可能會很難將這些符號從這個連續的比特流中分離出來。另一種方式是分配相同數量的符號位,並且以這種方式解碼器可以容易地恢復原始數據,但是可能會浪費比特,因爲符號具有不同的值,這又導致比特流中的許多比特是零(我猜這是浪費)。如何編寫比特流

任何提示我該怎麼辦?

我是編程新手。任何幫助將不勝感激。

+0

這裏是我對類似的答案問題在這裏: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

+0

通常的方法是打包位,但這需要邏輯知道另一邊的位數。您可能會逐個解碼,以瞭解您何時到達符號的末尾。 – 2012-07-16 22:33:18

+1

你的問題涉及到編碼領域。霍夫曼編碼,如下所述,是一種選擇。但也有其他的,因爲霍夫曼編碼不是唯一的(但它肯定是最受歡迎的)。請參閱Moffat和Turpin的書「Compression and Coding Algorithms」。大多數壓縮書都有關於編碼的內容。本書着重於編碼。在「硬性時間分離」方面,您需要一個無前綴的代碼 - 沒有代碼是任何其他的前綴。 – Ray 2012-08-07 03:42:37

回答

2

聽起來像你試圖做類似霍夫曼壓縮計劃的東西?我只需逐字節(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'流的其餘部分。您還需要處理符號值從一個字節溢出到下一個字節的情況。