2016-03-14 166 views
0

我一直在學習RFC1951和「puff.c」,並有一個關於「不完整長度」的問題問題。DEFLATE(RFC1951)動態霍夫曼「不完整長度的」

作爲鄰近我所知,限定了「動態」霍夫曼碼錶,其允許比HLIT指定+ 257會產生一個錯誤,至少由puff.c.多個代碼例如,如果作爲簡單的調試測試,我將使用所有9位代碼的Huffman表來定義僅257個點亮/透鏡,則會產生錯誤'puff.c'。這是結果有目的還是錯誤?我能否假設基於'zlib'庫的任何「充氣機」都會產生相同的錯誤?

我找不到在RFC 1951年的任何規範,應要求使用足夠緊密的霍夫曼碼。當然,我可以看到在壓縮方面使用「低訂閱」的霍夫曼表可能效率很低,但我不確定爲什麼應該禁止使用這樣的表。

我的興趣不只是假設。我真的希望使用一個訂閱不足的,只有文字的哈夫曼代碼(但不是上面引用的例子)來將一些應用程序特定的圖像壓縮成PNG文件。但我想確保它可以與任何PNG圖像查看器一起使用。

回答

0

的RFC指定該代碼是霍夫曼碼,其通過定義是完整碼。 (完全意味着所有的位模式被使用。)

ZLIB將拒絕不完全或過度使用的代碼,除在特殊情況下,在RFC指出:

如果只使用一個距離的代碼,它是編碼的使用一位,而不是 零位;在這種情況下,有一個單一的代碼長度,一個 未使用的代碼。

在那裏,允許使用代碼1未使用的單個符號不完整的代碼0。如果只有一個距離符號,那麼你不需要任何位來指定它,你知道那個距離符號必須使用任何長度,如果那個符號需要額外的比特,那麼這些額外的比特就會跟隨這個長度,但是,很好 - 對於這種情況,Phil Katz在每場比賽中都放了一個無關的零比特,現在我們一直堅持下去)。 RFC甚至必須注意到這種特殊情況是另一個線索,即不完整的代碼不被接受,否則。

deflate還有另一種例外,因爲固定的文字/長度代碼是不完整的,最後有兩個未使用的代碼。

底線是,否,您將無法在動態頭中使用不完整的代碼(特殊情況除外),並期望zlib或任何兼容的deflate解碼器能夠解碼它。

至於爲什麼這個嚴格性是有用的,對動態標頭的限制允許快速檢測非放氣流或損壞的放氣流。類似地,zlib不允許動態報頭沒有結束碼,以避免假動態報頭允許任何隨後的隨機比特永久解碼,從不檢測錯誤。未使用的固定代碼在這方面也有幫助,因爲最終它們在隨機輸入中觸發錯誤。順便說一下,如果你想爲你的情況定義一個固定的,完整的霍夫曼代碼,那麼它非常簡單,並且可以將幾乎所有代碼的大小縮小一位。只需對符號0..253進行8位編碼,直接使用該符號編號作爲代碼(當然顛倒比特),並使用代碼508..511(比特反轉)將符號254..259作爲9比特。

+0

謝謝。我承認你關於規範的「措辭」的觀點並接受現實。但在所有應有的尊重,關於實用性,我沒有看到RAPID腐敗檢測的論點。使用完整的代碼,ANY組合的比特序列將產生看似有效的符號。錯誤檢測只發生在EOB過早或缺少錯誤的情況下,或者根據RFC1950的校驗和。另一方面,一個不完整的代碼可以實現快速的錯誤檢測:快速性與不完整性成正比。事實上,puff.c中有限的錯誤檢測說明了我的觀點。 – codechimp

+0

但是爲了獲得完整的代碼,動態頭必須滿足約束條件,這幾乎不會被隨機數據滿足。所以隨機輸入將在頭部被檢測到,並且你永遠不會得到代碼。更快。 –