Как рассчитать crc для байтового массива?

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

#define WIDTH  8
#define TOPBIT 1 << 7
#define POLYNOMIAL 0xD8

uint8_t(uint8_t const message)
{
    uint8_t remainder = 0;  
    remainder ^= message;
    for (uint8_t bit = 8; bit > 0; --bit)
    {
        if (remainder & TOPBIT)
        {
            remainder = (remainder << 1) ^ POLYNOMIAL;
        }
        else
        {
            remainder = (remainder << 1);
        }
    }
    return (remainder);

}

а как насчет байтового массива? Я нашел выше код на этом сайте, Автор также дал код для байтового массива, где он просто XOR'ed текущий остаток со следующим байтом

remainder ^= (message[byte] << (WIDTH - 8));

Я не совсем понимаю, почему? почему он сделал XOR, чтобы получить следующий байт в остаток?

2 ответа

См . Безболезненное руководство по алгоритмам обнаружения ошибок CRC. Там есть все о CRC, включая ваш вопрос. Массив обрабатывается как одно массивное число, поэтому остаток переносится на следующий байт. CRC - это остаток, который остается в конце.

Посмотрите на страницу в Википедии. Математика циклических проверок избыточности. Оказывается, что CRC является линейной операцией, означающей, что crc(x^y^z) = crc(x)crc(y)crc(x) и, следовательно, автор XOR'd остаток предыдущего байта со следующим байтом

Другие вопросы по тегам