zlib uncompress解壓資料inflate_fast函數出錯的解決辦法
轉自:http://blog.csdn.net/u013283835/article/details/70311499
最近在開發pdf電子簽章過程中遇到了點棘手的問題,因為pdf標準支援讀取zlib壓縮後的stream物件,因此,可以通過這個手段將stream裡面的操作資料用zlib解壓出來,以此來研究裡面的具體操作是什麼,但是當我們用二進位制將stream裡面的資料讀到檔案裡面的時候,會出現一些很棘手的錯誤,導致了很多人懷疑這條路是走不通的,這裡,樓主貢獻一下自己的思路:
問題1:讀取完檔案之後會自動出現,沒錯資料開頭跟結尾會多加了0d0a也就是換行符,因為我們在用zlib解決的時候,會返回-3,也就是資料錯誤,解決方法就是將這4個字元刪掉。
問題2:當我們在呼叫uncompress解壓資料的時候,很有可能會在inflate_fast這個函式裡面崩潰掉,原因是記憶體讀取失敗,也就是越界了,並且出錯的地方是一些彙編程式碼。這讓你很費解,到底該怎麼辦,彙編程式碼不太好搞定。這時候很多人就會在這裡停住,可能會想起他的出路了。而樓主並沒有因此而停止腳步,下面讓我們揭開神祕的面紗:
首先我們開啟inffast.c這個檔案,拉到頭,你會看到這樣一行文字,如下,意思就是如果你用了彙編編譯器來編譯的話,那麼很有可能彙編的程式碼有bug(坑。。。),而在zlib官網下載的zlib庫預設的是定義了ASMINF這個庫的,因此就出現了開頭說的那個bug,問題到這裡似乎就迎刃而解了,解決的方案就是將這個巨集定義註釋掉,也就是不使用匯編版的infate_fast函式,而是使用