Возможно, я просто не вижу его, но CRC32 кажется или напрасно сложным, или недостаточно объясненный где угодно я мог найти в сети.
Я понимаю, что это - остаток от non-carry-based арифметического подразделения значения сообщения, разделенного на (генератор) многочлен, но фактическая реализация его выходит из меня.
Я прочитал Безболезненное Руководство По Алгоритмам Обнаружения ошибок CRC, и я должен сказать, что это не было безболезненным. Это пробегается через теорию скорее хорошо, но автор никогда не добирается до простого, "это - это". Он действительно говорит, что параметры для стандартного алгоритма CRC32, но он забыл размечать ясно, как Вы добираетесь до него.
Часть, которая получает меня, - когда он говорит, что "это - она" и затем прибавляет, "о, между прочим, она может быть инвертирована или запущена с различных начальных условий" и не дает четкий ответ того, что заключительный способ вычислить контрольную сумму CRC32, учитывая все изменения он просто добавил.
Я попытался кодировать в C, как таблица формируется:
for (i = 0; i < 256; i++)
{
temp = i;
for (j = 0; j < 8; j++)
{
if (temp & 1)
{
temp >>= 1;
temp ^= 0xEDB88320;
}
else {temp >>= 1;}
}
testcrc[i] = temp;
}
но это, кажется, генерирует значения, несовместимые со значениями, которые я нашел в другом месте в Интернете. Я мог использовать значения, которые я нашел онлайн, но я хочу понять, как они были созданы.
Любая справка в разрешении этих невероятно запутывающих чисел очень ценилась бы.
CRC довольно проста: вы берете многочлен, представленный в виде битов и данных, и делите многочлен на данные (или представляете данные в виде многочлена и делаете то же самое). Остаток, который находится между 0 и полиномом, является CRC. Ваш код немного трудно понять, отчасти из-за его неполноты: temp и testcrc не объявлены, поэтому неясно, что индексируется и сколько данных проходит через алгоритм.
Способ понять CRC состоит в том, чтобы попытаться вычислить несколько, используя короткий кусок данных (16 бит или около того) с коротким полиномом - возможно, 4 бита. Если вы потренируетесь таким образом, вы действительно поймете, как вы можете приступить к кодированию.
Если вы делаете это часто, CRC довольно медленно вычисляется программно. Аппаратные вычисления намного эффективнее и требуют всего несколько вентилей.