1

私はCRC32、MD5などのアルゴリズムが苦手なので、質問するのも難しいです:)

基本的に使用するC#アプリケーションがあります

[DllImport("Crc32.dll")]
private static extern UInt32 CRC32Calc(UInt32 crc32, byte[] buffer, uint length);

コードのさらに下では、Generateこのようなメソッドでそれを使用します

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

特定のcrcSeed値を使用している間。

Generate私の仕事は、正しいCRC計算を維持しながら、メソッド全体をPHP関数に作り直すことです。

PHPの

int crc32 ( string $str )

crcSeedを設定できないため、関数が機能しません。だから私の質問は:

Linuxマシンでコードを使用できるように、外部のdllなどに頼らずにPHPで正確なcrc32計算を行うにはどうすればよいですか?

編集:

CRCはチャンクで計算され、crcSeedが最初のものになります。

CRC32Calcメソッドは実際にはSCTPCRC-32Cバージョンを使用しているため、現在はPHPの実装のみが必要です。

4

1 に答える 1

2

一般に、データは、入力の長さに比例するのではなく、アプリケーションのメモリ使用量を一定にするために、一度にすべてではなく、一度にチャンクで処理されます。その結果、一度に1つのチャンクでデータを処理できる関数が必要になります。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)

クイックグーグル検索は、チャンクでのcrcの計算をサポートするphpの組み込み関数を見つけません-一度にのみ。あなたはあなた自身を転がす必要があるかもしれません。効率的なcrc計算の多くの例をオンラインで見つけることができます。これは、通常、256crcのテーブルを使用します。まず、目的に基づいて計算しているcrcを知る必要があります。gzip、png、イーサネットなどで使用されているcrc-32ですか?iSCSIで使用されているcrc-32cですか?他に何かありますか?

アップデート:

さて、それはcrc-32cです。ここで、そのcrc(および他の多くの)をサポートするcrcコードジェネレーターを探すことができます。

于 2012-07-10T13:17:38.090 に答える