2012-07-10 87 views
1

我不擅長像CRC32,MD5等算法,所以我甚至有困難的問這個問題:)CRC32從C++/C#到PHP

基本上沒有使用

C#應用程序
[DllImport("Crc32.dll")] 
private static extern UInt32 CRC32Calc(UInt32 crc32, byte[] buffer, uint length); 

並且在該代碼進一步向下,同時使用特定的crcSeed值使用它的方法中Generate這樣

UInt32 crc = CRC32Calc(crcSeed, rawData, (uint)rawData.Length); 

我的工作是將整個Generate方法修改爲PHP函數,同時保留正確的CRC計算。

我認爲PHP的

int crc32 (string $str) 

功能將無法工作,因爲我不能設置crcSeed。所以我的問題是:

我怎樣才能在PHP中做出確切的crc32計算,而不訴諸外部DLL的等等,所以我可以使用代碼和Linux機器?

編輯:

CRC被與crcSeed爲初始一個塊計算。

CRC32Calc方法實際上是使用SCTP CRC-32C版本,所以現在只需要一個PHP實現。

+0

我不認爲[CRC](http://en.wikipedia.org/wiki/Computation_of_CRC)使用種子。在調用CRC32Calc之前設置的值是多少? – CodeCaster 2012-07-10 12:47:15

+4

您的DLL導入crc32.dll不是Windows附帶的庫。我們不知道它是如何工作的或它有什麼作用。 – vcsjones 2012-07-10 12:48:04

+0

我的印象是,種子是一個不同於「標準」0xFFF ... FFF或「所有」的起點,雖然我實際上不知道CRC如何計算,只能確定新的我寫這兩個代碼並進行比較。 – Azder 2012-07-10 12:51:15

回答

2

通常,數據一次處理一個塊而不是一次全部處理,以便使應用程序的內存使用量保持不變,而不是與輸入長度成正比。因此,您需要一次可以處理數據塊的功能。編寫crc函數是爲了支持這個功能,因此它們接受距前一個塊爲止的crc值作爲參數,然後函數在應用當前塊中的數據之後計算crc值。

updated_crc = crc(last_crc, this_chunk_data_pointer, this_chunk_length) 

到目前爲止,crc值就是你所說的「種子」。

您爲第一個塊提供的第一個crc是零長度序列的crc值。它由正在使用的crc標準定義。通常它是零,但它可以是其他值,如所有二進制。

first_crc = crc(0, first_chunk_data_pointer, first_chunk_length) 

快速谷歌搜索沒有在php中支持計算crc的內置函數 - 只能一次全部執行。你可能需要推出自己的。你可以在網上找到很多有效的crc計算的例子,通常使用256 crc的表格。首先你需要知道你正在計算哪個crc。是gzip,png,ethernet等中使用的crc-32嗎?是iSCSI中使用的crc-32c嗎?還有別的嗎?

更新:

好了,所以它的CRC-32C。你可以看看here的crc代碼生成器支持crc(以及其他許多)。

+0

感謝您的回答,你指出了它的權利:) 我認爲它使用塊從一開始,在最後一個小時,同時通過C++代碼搜索線索我確定了SCTP CRC32C。所以,好的電話! :) 現在,只是一個更新的問題,並進一步google搜索。 – Azder 2012-07-10 14:23:43