
Сообщение от
VladimirU
Можно ли этот способ применить для вычисления crc8.?
Не очень это похоже на crc. Может быть не весь код приведен, но пока мимо.
Я бы предложил вот такое решение:
C++ |
1
2
3
4
5
6
7
| uint8_t crc8(const uint8_t (&table)[256], uint8_t *pdata, size_t nbytes, uint8_t crc)
{
while (nbytes-- > 0)
crc = table[(crc ^ *pdata++) & 0xff];
return crc;
} |
|
где pdata, nbytes входная последовательность и ее размер
crc - начальное значение (например 0xFF)
table - таблица crc8 рассчитанная по одному из полиномов (см. теорию)
CRC8_TABLE_SIZE = 256
Таблицу можно найти в инете или сгенерировать самому.
Пример функции генерации таблицы (MSB вариант):
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
| void crc8_generate_table(uint8_t (&table)[CRC8_TABLE_SIZE], uint8_t poly)
{
const uint8_t msbit = 0x80;
table[0] = 0;
uint8_t t = msbit;
for (int i = 1; i < CRC8_TABLE_SIZE; i *= 2)
{
t = (t << 1) ^ (t & msbit ? poly: 0);
for (int j = 0; j < i; ++j)
table[i+j] = table[j] ^ t;
}
} |
|