2011-12-27 36 views
2

我試圖在插入所有實際的壓縮文件數據後,將哈夫曼樹寫入壓縮文件。但是,我只是意識到了一點問題,假設我決定一旦所有的實際數據都寫入文件,我就會輸入2個換行字符,然後寫入樹。 這意味着,當我讀回東西時,這兩個換行符(或任何字符)是我的分隔符。問題是,完全可能的是,實際數據也有2個換行符,在這種情況下,我的分隔符檢查將失敗。 我在這裏舉了兩個換行符的示例,但對於任何字符串都是如此,我可以通過可能採用較長的字符串作爲分隔符來顛覆問題,但這會產生兩個不理想的效果: 1.有仍然是一個遙遠的機會,長字符串在壓縮數據中存在一些巧合。 2.不一定需要膨脹一個需要壓縮的文件。在壓縮後將huffman樹寫入文件

有沒有人有關於如何從樹數據中分離壓縮數據的建議?

回答

3

首先,以字節爲單位寫入樹的大小。然後,寫下樹本身,然後寫下內容本身。

閱讀時,首先閱讀大小,然後樹(現在你知道有多少個字符可讀),然後是內容。

大小可以寫成一個字符串,以換行符結束 - 這樣,您知道第一個數字和換行符屬於樹的大小。

+0

這就是我最初想到的,但問題是樹可能很大!所以我必須寫一個Integer,就是那4個字節! 而如果我把它寫成一個字符串,那麼我使用一個字節爲每個整數,我把它放在那裏。對於試圖通過一次保存2或3位來壓縮內容的程序來說效率不高。 – angryInsomniac 2011-12-27 13:15:24

+0

你認爲樹有多大?幾千字節? – Giorgio 2011-12-27 13:28:11

+0

@angryInsomniac在合適的條件下,它甚至比'size(tree)+ size(compressed_data)'可能會比'size(original_data)'更大。如果你的字母很小並且數據很大(不是均勻分佈的),顯然這只是有意義的。 如果您對通信位數最少(當考慮字典時),有一個很大的理論計算機科學(開放)研究領域稱爲通信複雜性:) – user1071136 2011-12-27 14:06:38

0

爲什麼不在前8個字節(每個4個)上寫大小和len,然後是數據? 然後像這樣:

uint32_t compressed_size; 
uint32_t data_len; 
char * data; 

file.read((char*)compressed_size, 4); 
file.read((char*)data_len, 4); 
data = new char[data_len]; 
zip.read(data, data_len); 

應該工作。 您可以縮小數據以獲得更好的壓縮效果。