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方法改造成 PHP 函数,同时保留正确的 CRC 计算。

我认为PHP的

int crc32 ( string $str )

功能将不起作用,因为我无法设置 crcSeed。所以我的问题是:

如何在 PHP 中进行精确的 crc32 计算而不求助于外部 dll 等,以便我可以在 Linux 机器上使用代码?

编辑:

CRC 是按块计算的,其中 crcSeed 是初始值。

CRC32Calc 方法实际上是使用 SCTP CRC-32C 版本,所以现在只需要一个 PHP 实现。

4

1 回答 1

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)

快速的 google 搜索不会在 php 中找到支持以块计算 crc 的内置函数 - 只能一次完成。您可能需要自己滚动。网上可以找到很多高效crc计算的例子,一般都是用256个crc的表。首先,您需要知道根据它的用途计算的是哪个 crc。是 gzip、png、以太网等中使用的 crc-32 吗?是 iSCSI 中使用的 crc-32c 吗?还有什么?

更新:

好的,所以它是 crc-32c。您可以在此处查找支持该 crc(以及许多其他)的 crc 代码生成器。

于 2012-07-10T13:17:38.090 回答