png中的crc32

 找點東西來研究一下吧,把本來自己眼前的一座高高的大山,挖空踩扁,再使勁跺上幾腳是不是很爽!哈哈


最近幾天鑽了好一陣CRC(循環冗餘校驗),搞不懂他是怎麼回事???在網上找了幾篇文章也是說的不清楚,還好現在弄明白了

我要計算png圖片中的crc32校驗和,因爲改變png圖片中某數據塊的數據後,按照標準規定需要從新計算校驗和寫入文件(實際上不更新校驗和,圖片一般也能用)。

 

1> crc32原理 : 帶模2運算的多項式長除法,求餘數

基本思路:對於一串數據d,d的二進制序列對應的多項式除以32位生成多項式g(x)

X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X+1

對應於0X04c11db7,X^32的係數隱藏在算法中。

 

2> png中的crc32原理: 與標準crc32有所不同,對數據處理前後各做了一些處理

(初始餘數寄存器爲全一,最終餘數取反(據w3c標準規定))

 

3> 注意:

對數據流的對待方式爲,原數據以八位的字節流爲例,每一字節的高位被視爲低位,每一字節的低位被視爲高位,全部數據從高位到低位的順序處理,例


原數據:10010110 11001101 10101110 10001011 (1)


被認爲的數據:01101001 10110011 01110101 11010001 (2)


即實質的運算爲二進制序列(2)對應的多項式除以生成多項式g(x)


4> 說明:
實際算法中有寄存器左移和右移兩種方式,左移需要把每字節數據反轉,g :0x04c11db7 ;右移則可以把寄存器反轉過來用,高位做低位,低位做高位,省去了字節反轉的操作,g:0xedb88320。實際應用中使用右移查表的方式

 

按位右移算法:
http://blog.china-pub.com/more.asp?name=reverie&id=4311
(此資料計算的最後結果取反纔是png的crc32)

實用算法及程序:
http://www.libpng.org/pub/png/spec/1.0/PNG-Structure.html#CRC-algorithm
(3.4. CRC algorithm)

 

雨過天晴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章