2013-10-30 111 views
1

我試圖模仿用於創建CRC在PNG文件的功能,我使用的是AUTODIN II多項式和源代碼:
http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.cCRC32計算對於PNG塊不符合真正的

我的測試都是針對IHDR塊的,所以我的參數是:
crc - 0xffffffff和0(均已被建議)
buff - IHDR塊的類型的地址。
長度 - IHDR塊的長度+4(塊大小的數據長度+類型的長度)

我打印了計算出的二進制CRC,並將其與塊的實際CRC進行比較。我可以看到沒有相似之處(小大端,顛倒位,異或等)。

這是IHDR組塊(十六進制格式)的數據:
長度(大端):D0 00 00 00(13)
類型:49 48 44 52
數據:00 00 01 77 00 00 01 68 08 06 00 00 00
現有CRC:B0 BB 40的AC

如果有人能告訴我爲什麼我的計算是關閉,或者給我一個CRC32功能,將工作,我將不勝感激。 謝謝你!

+1

我看不到13個字節的數據* *。無論如何,您需要在CRC32計算中包含類型ID('IHDR'),也就是說,您需要將17個字節的緩衝區傳遞給'crc32'函數。 – Jigsore

+0

@Jigsore,我糾正了數據,謝謝。我誤解了我的輸出。 – Alter

回答

0

PNG圖像中使用的CRC-32算法在這裏描述:http://www.w3.org/TR/PNG-Structure.html#CRC-algorithm(還有一個鏈接到C代碼做測試計算)。

但是@Jigsore指出,你不會從你在這裏發佈的數據中獲得明智的結果。你給了我們一個4字節的類型標識符,看起來像7.5字節的數據。根據長度標題,總共應該有13個字節。

編輯: 這個工程使用功能從w3.org:

int main() { 
    char input[] = { 0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x77,0x00, 
        0x00,0x01,0x68,0x08,0x06,0x00,0x00,0x00 }; 
    printf("%08lx\n",crc(input,17)); 
    return 0; 
} 

輸出: ac40bbb0

+0

我實際上也使用了測試計算的源代碼。在將CRC更改爲0xffffffff或0並使長度參數爲塊長度+8(對於類型和crc)後,我最終獲得了與以前相同的結果。 (我更正了數據,謝謝) – Alter

+0

仔細閱讀W3鏈接。您不希望在CRC計算中包含塊長度。 (Quote:一個4字節的CRC(循環冗餘校驗)計算在塊中的前面的字節,包括塊類型代碼和塊數據字段,但**不**包括長度字段。) –

+0

對不起,我繼續錯誤,我的buf的開始是CRC類型的地址。我試着總共讀取17個字符(類型+數據)以及21個字符,以包括我設置爲0的CRC或0xfffffff – Alter