估計上回分析EMF檔案還不過癮,這回突然有興趣想把docx裡面的圖片給挖出來。用RIA來實現,B/S模式的服務還是比較方便的。
1,從docx說起,改了尾碼為zip就可以看到裡面有啥東西了。圖片就放在word/media檔案夾下,圖片的其他資訊放在word/document.xml裡面。對於ooxml,用的時候再去看那些節點是什麼意思,這樣理解得更快點,不適合閑暇時玩弄。docx大概就這樣,對它不太有興趣。
2,從fzip說起,開源庫,compress和decompress檔案。這個開源庫用了個編碼技巧,代碼如下:
protected function parse(stream:IDataInput):Boolean {<br />while (parseFunc(stream));<br />return (parseFunc === parseIdle);<br />}
parseFunc為function類型,一個while裡面跳了parseHead,parseExt,parseContent幾個函數後再結束,也就是等於把zip裡面的每個壓縮檔的檔案頭和資料,擴充欄位都跑了一遍。和代碼大全裡面提到的索引方法類似,可以修改一下之前寫EMF檔案分析的幾個很突兀的if else if格式。用fzip很快就把docx裡面的圖片給取出來了,不過這樣做下去也沒太多意思,但如果不用fzip,直接手工取出來會是咋樣的。
3,deflate,zlib
網上的一撮撮的代碼都是用AIR實現的,大部分zip都是用deflate來壓縮的,所以把資料部分取出來後,直接一個uncompress("deflate")就處理完了。沒啥高明之處。而用RIA,就好玩了。RIA只對ZLIB做處理,也就是大部分zip都無法用RIA直接解壓。而deflate和zlib核心部分是相同的,而zlib比deflate多了2個頭位元組和尾部一個4位元組的校正碼,這樣把資料部分抽取出來後,加上個頭和尾,然後用uncompress就可以解壓。如果沒有理解錯壓縮資料這部分,應該能解出來,但是實驗結果卻還是報出解壓錯誤。再看回fzip裡面的東西,zlib的校正碼是_adler32,而這個adler32卻是在擴充欄位裡面讀取的,大部分zip的擴充欄位還都是為0.所以得出結論,做了件挫事。用deflate格式來壓縮的話,就只能用deflate來解,其他格式資訊不足,顯然就不能用其他格式的函數來解。挫!
4,fzip,壓縮資料演算法
這個開源庫很不錯,以及一個壓縮資料這一塊還是狠迷人的。學習裡面的全部時間上估計不太實際,學裡面的部分,有些時候還是可以做到。多做些挫事,多長些智慧。
附上一些查過來的網址 :
gzip原理與實現:
http://blog.csdn.net/FringeDream/archive/2005/12/08/546890.aspx
壓縮演算法deflate
http://hi.baidu.com/ͼ%BA%BC%BFƼ%BC/blog/item/b2d1731812146eb34bedbc5b.html
flex zlib壓縮資料包格式
http://wenyu.csai.cn/user1/24996/archives/2009/37782.html