Как рассчитать 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 остаток предыдущего байта со следующим байтом