CRC32 От C ++ / C # до PHP

Я не разбираюсь в таких алгоритмах, как CRC32, MD5 и т. Д., Поэтому мне даже сложно задавать вопрос 🙂

В основном есть приложение C #, которое использует

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

и далее в коде используется его в методе Generate like this

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

используя определенное значение crcSeed .

Моя задача – переработать весь метод Generate в функции PHP, сохраняя при этом правильный расчет CRC.

Я думаю, что PHP

 int crc32 ( string $str ) 

функция не будет работать, потому что я не могу установить crcSeed. Поэтому мой вопрос:

как я могу сделать точное вычисление crc32 в PHP, не прибегая к внешним dll и т. д., поэтому я могу использовать код для Linux-машины?

РЕДАКТИРОВАТЬ:

CRC вычисляется в кусках, когда crcSeed является исходным.

Метод CRC32Calc на самом деле использует версию SCTP CRC-32C, поэтому теперь требуется только реализация PHP.

Solutions Collecting From Web of "CRC32 От C ++ / C # до PHP"

В общем случае данные обрабатываются куском за раз, а не сразу, для того, чтобы использовать память в приложении, а не пропорционально длине ввода. В результате вам нужны функции, которые могут обрабатывать данные одновременно. Для этого поддерживаются функции 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 вы рассчитываете, исходя из того, для чего он предназначен. Это crc-32, используемый в gzip, png, ethernet и т. Д.? Это crc-32c, используемый в iSCSI? Что-то другое?

Обновить:

Хорошо, так это crc-32c. Вы можете посмотреть здесь генератор кода crc, который поддерживает этот crc (как и многие другие).