zlib解壓縮時對破損資料的處理

2021-05-24 22:19:44 字數 1039 閱讀 2988

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...