Как контрольная сумма CRC32 вычисляется?

Возможно, я просто не вижу его, но CRC32 кажется или напрасно сложным, или недостаточно объясненный где угодно я мог найти в сети.

Я понимаю, что это - остаток от non-carry-based арифметического подразделения значения сообщения, разделенного на (генератор) многочлен, но фактическая реализация его выходит из меня.

Я прочитал Безболезненное Руководство По Алгоритмам Обнаружения ошибок CRC, и я должен сказать, что это не было безболезненным. Это пробегается через теорию скорее хорошо, но автор никогда не добирается до простого, "это - это". Он действительно говорит, что параметры для стандартного алгоритма CRC32, но он забыл размечать ясно, как Вы добираетесь до него.

Часть, которая получает меня, - когда он говорит, что "это - она" и затем прибавляет, "о, между прочим, она может быть инвертирована или запущена с различных начальных условий" и не дает четкий ответ того, что заключительный способ вычислить контрольную сумму 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;
}

но это, кажется, генерирует значения, несовместимые со значениями, которые я нашел в другом месте в Интернете. Я мог использовать значения, которые я нашел онлайн, но я хочу понять, как они были созданы.

Любая справка в разрешении этих невероятно запутывающих чисел очень ценилась бы.

86
задан Oreo 20 November 2017 в 15:33
поделиться

1 ответ

CRC довольно проста: вы берете многочлен, представленный в виде битов и данных, и делите многочлен на данные (или представляете данные в виде многочлена и делаете то же самое). Остаток, который находится между 0 и полиномом, является CRC. Ваш код немного трудно понять, отчасти из-за его неполноты: temp и testcrc не объявлены, поэтому неясно, что индексируется и сколько данных проходит через алгоритм.

Способ понять CRC состоит в том, чтобы попытаться вычислить несколько, используя короткий кусок данных (16 бит или около того) с коротким полиномом - возможно, 4 бита. Если вы потренируетесь таким образом, вы действительно поймете, как вы можете приступить к кодированию.

Если вы делаете это часто, CRC довольно медленно вычисляется программно. Аппаратные вычисления намного эффективнее и требуют всего несколько вентилей.

8
ответ дан 24 November 2019 в 08:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: