2013-07-01 98 views
1

編碼需要一些幫助來了解DEFLATE編碼如何工作。我知道這是LZSS算法和霍夫曼編碼的組合。DEFLATE利用靜態霍夫曼編碼

因此,讓編碼例如「Deflate遲到」。 Params:[Search buffer:8kb and Look-ahead buffer 4kb]那麼,LZSS算法的輸出是「Deflate < 5,4>」下一步使用靜態霍夫曼編碼來減少冗餘。這是我的問題,我不知道我應該如何編碼這對< 5,4>與霍夫曼。


將帖子

d 000
˚F001
升010
一個011
噸100
_ 101
ë11

這麼好,根據本表字符串「Deflate」被寫爲000 11 001 010 011 100 11 101.下一步讓我們編碼t他配對(5,4)。根據書籍「數據壓縮 - 完整參考」的長度4的固定前綴碼是258,隨後是距離5的固定前綴碼(碼4 + 1額外比特)。

即可以概括爲:

長度4 - > 258 - > 0000010
距離5 - > 4 + 1額外位 - > 00100 | 0

因此,經編碼的字符串被寫入作爲[header:1 01] 000 11 001 010 011 100 11 101 0000010 001000 [end-of-block:0000000],但是如果我創建了一個huffman樹,它不再是一個靜態的huffman,對吧?

好日子

+0

既然你沒有問如何編碼的「放氣」,那麼你一定已經知道如何發出Huffman編碼這些文字。你做同樣的事情,你發出長度爲4而不是文字,然後是距離代碼5. –

+0

所以,根據這張表,字符串「Deflate」被寫爲000 11 001 010 011 100 11 101 。下一步讓我們編碼這對(5,4)。根據書籍「數據壓縮 - 完整參考」的長度爲4的固定前綴碼是258,隨後是固定的距離爲5的前綴碼。 [總結]: 長度4 - > 258 - > 0000010 [7位] 距離5 - > 4 + 1額外位 - > 00100 | 0 因此,編碼的字符串被寫爲[標題:1 01] 000 11 001 010 011 100 11 101 0000010 001000 [end-of-block:0000000],但是如果我創建一個huffman樹,它不是一個靜態的huffman,對吧? – FewG

回答

8
D 000 
f 001 
l 010 
a 011 
t 100 
_ 101 
e 11 

是不是放氣靜態代碼。靜態文字/長度碼全部是7,8或9位,距離碼全部是5位。你問了關於靜態代碼。

「放氣後期在靜態deflate格式編碼爲文字「放氣」和一個長度爲4,距離5匹配以十六進制是:

73 49 4d cb 49 2c 49 55 00 11 00 

即細分如下(位從讀每個字節第一)的至少顯著部分:

011 - 01 means fixed code, 1 means last block 
00101110 - D 
10101001 - e 
01101001 - f 
00111001 - l 
10001001 - a 
00100101 - t 
10101001 - e 
00001010 - space 
0100000 - length 4 
00100 - distance 5 or 6 depending on one extra bit 
0 - extra bit -> distance 5 
0000000 - end code 
0 - fill bit to byte boundary 
+0

你能否詳細說明爲什麼00101110 = D和10101001 = e? – TLJ

+2

閱讀RFC 1951,第3.2.6節。 D = 0x44。加0x30得到0x74。反轉這些位並得到00101110.e = 0x65。加上0x30得到0x95。顛倒這些位並得到10101001. –

+0

RFC非常令人困惑,並且有十進制表格而不是二進制表,並且沒有清楚地解釋這些表是如何派生的。你從哪裏得到0x30?它總是+ 0x30,還是基於你添加的值?你爲什麼顛倒位?你知道任何其他資源(除RFC外),它們提供了壓縮數據膨脹的明確例子,並解釋了爲什麼固定表格是他們是什麼? – Dan