zlib解壓縮的時候碰到資料截斷怎麼辦?
最近碰到了乙個問題,被zlib壓縮的資料的前段資料丟失,導致後續資料無法解壓縮,但經過實驗,發現zlib已經提供的很強的容錯能力,問題最終解決。
實驗過程舉例如下:
方式1:使用z_sync_flush引數分段壓縮,整體解壓縮
解壓縮成功。
方式2:使用z_partial_flush引數分段壓縮,整體解壓縮
(**同方式1)
解壓縮成功
方式3:使用z_partial_flush引數分段壓縮,同時解壓縮
解壓縮成功
方式4:使用z_sync_flush引數分段壓縮,同時解壓縮
(**同上)
解壓縮成功
方式5:使用z_sync_flush引數分段壓縮,之後從中間解壓縮
解壓縮失敗,錯誤資訊:
buffer_uncompress: inflate returned -3
解壓縮方法改為:
status = inflatesync(&incoming_stream);
status = inflate(&incoming_stream, z_sync_flush);
解壓縮成功,得到了從截斷處開始的資料
方式6:同方式4,但解壓縮前執行inflatesync
解壓縮出錯,錯誤資訊:illegal seek
由此可見,inflatesync可以處理資料截斷的問題,但是只有確定資料是截斷的才能呼叫。
另外在截斷的資料的前面附加0x78,0x9c或者0x0,0x0,0xff,0xff也可以實現正常解壓縮。
0x78,0x9c是zlib資料頭(非固定,參考rfc 1951),而00 00 ff ff是zlib容錯方式的資料塊頭。
又經多次實驗,發現zlib壓縮的特點,是可以逐塊壓縮,逐塊解壓縮;或者整體壓縮,然後逐塊解壓縮;
但是不能逐塊壓縮,然後跨塊解壓縮。(不inflatesync的話)
附解壓縮函式源**:
編譯方法:
gcc -lz compress.c stream_test.c -g
Zlib解壓縮示例
先上 壓縮包的檔案結構解析 zip unzopen resitem filename if 0 zip return false done unzgotofirstfile zip while done unz ok dword dwfilenum 0 dword dwfilepos 0 unzge...
qt 呼叫zlib壓縮與解壓縮功能
zlib是一種免費且通用的壓縮庫,由於zlib壓縮效果比lzw好,而且解壓縮速度快,更重要的是商業軟體中使用zlib不需要繳納版權費,所以很多遊戲都使用zlib壓縮資源檔案。zlib聯合使用lz77演算法和huffman哈夫曼樹來實現資料壓縮和資料解壓。zlib原始碼 void mainwindow...
Zlib庫的使用實現對zip檔案的解壓縮(二)
接之前的一篇文章 現在詳細地給出利用zlib對.zip檔案進行解壓縮的過程 參考文章 非常詳細 include unzip.h include zip.h include include using namespace std pragma comment lib,zdll.lib const ch...