Я не разбираюсь в таких алгоритмах, как 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.
В общем случае данные обрабатываются куском за раз, а не сразу, для того, чтобы использовать память в приложении, а не пропорционально длине ввода. В результате вам нужны функции, которые могут обрабатывать данные одновременно. Для этого поддерживаются функции 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 (как и многие другие).