2014-03-19 39 views
1

我目前正在實施一個png閱讀器,但我對數據的位順序和一般格式感到困惑。放氣格式尤其是動態哈夫曼編碼

我無權訪問libpng,zlib或類似文件。
請注意,我寫的任何位串都是最重要的位。

根據RFC1951「的數據元素被打包[...]開始與所述至少顯著位」

我的樣本圖像的第一個字節是:11101101
要讀取頭,我反轉位訂單,並得到:10110111

第一位是說這是最後一塊,這是有道理的。接下來的2位是「01」,這是否意味着靜態或動態huffman編碼? RFC僅將它們提及爲位,但不以它們的順序或它們的數值。

假設動態哈夫曼編碼,頭後面跟着2個霍夫曼字母。但是,這些也是編碼的。 0-15作爲文字,16以前重複(3 + 2位)次。我是否正確地假設17和18重複了字面0?

進一步的問題是:

  • 我才明白這一切是否正確?
  • 我如何知道字母編碼結束和下一個開始?
  • 與比特頭比特相比,哪個比特順序是字母表和實際壓縮數據?

我想我不明白,大多數章3.2.7 ...

回答

2

不要顛倒位除了Huffman編碼,且僅當您的解碼方法需要它呢。 zlib的充氣永遠不會顛倒位。噴出保留位僅用於解碼霍夫曼編碼。如果您試圖解釋所有反轉的位,您會感到困惑,並且您將不得不取消偏移位。

只要從底部讀取位。

在你的榜樣,11101101,底位爲1表明這首塊也是最後一塊。接下來的兩位(未反轉)10表示它是一個動態塊。

可以在zlib分配使用puff.c,在contrib/puff目錄,作爲補充RFC 1951 puff.c寫是一個簡單而明確的實施充氣的提供deflate格式的明確的定義。