天天看點

zlib uncompress解壓資料inflate_fast函數出錯的解決辦法

轉自:http://blog.csdn.net/u013283835/article/details/70311499

最近在開發pdf電子簽章過程中遇到了點棘手的問題,因為pdf标準支援讀取zlib壓縮後的stream對象,是以,可以通過這個手段将stream裡面的操作資料用zlib解壓出來,以此來研究裡面的具體操作是什麼,但是當我們用二進制将stream裡面的資料讀到檔案裡面的時候,會出現一些很棘手的錯誤,導緻了很多人懷疑這條路是走不通的,這裡,樓主貢獻一下自己的思路:

     問題1:讀取完檔案之後會自動出現

zlib uncompress解壓資料inflate_fast函數出錯的解決辦法

,沒錯資料開頭跟結尾會多加了0d0a也就是換行符,因為我們在用zlib解決的時候,會傳回-3,也就是資料錯誤,解決方法就是将這4個字元删掉。

     問題2:當我們在調用uncompress解壓資料的時候,很有可能會在inflate_fast這個函數裡面崩潰掉,原因是記憶體讀取失敗,也就是越界了,并且出錯的地方是一些彙編代碼。這讓你很費解,到底該怎麼辦,彙編代碼不太好搞定。這時候很多人就會在這裡停住,可能會想起他的出路了。而樓主并沒有是以而停止腳步,下面讓我們揭開神秘的面紗:

     首先我們打開inffast.c這個檔案,拉到頭,你會看到這樣一行文字,如下

zlib uncompress解壓資料inflate_fast函數出錯的解決辦法

,意思就是如果你用了彙編編譯器來編譯的話,那麼很有可能彙編的代碼有bug(坑。。。),而在zlib官網下載下傳的zlib庫預設的是定義了ASMINF這個庫的,是以就出現了開頭說的那個bug,問題到這裡似乎就迎刃而解了,解決的方案就是将這個宏定義注釋掉,也就是不使用彙編版的infate_fast函數,而是使用C語言版的,這樣就不會出現問題了。一個人的開發,真是的很枯燥而且是考驗心性的,我現在特别了解為什麼公司招聘的時候都要先進行心理測試,問題一頭霧水的時候,太考驗各人心裡的承受能力了,這幾天快被這個折磨瘋了

繼續閱讀