Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Получение CRC-16 из массива байт

Из мануала к COM устройству есть пример:

, где 2 последних байта рассчитываются как CRC-16 первых байтов с полиномом X16-X15-X2-1 и инициализации 0xFFFF.
пользуясь онлайн калькулятором подсчета crc-16 сумм я не смог добиться этих значений. Грешу на мануал, но все алгоритмы найденные здесь дают разные результаты...


Ответ

Всё абсолютно стандартно:
#include
static unsigned short crc_16_table[256];
static void make_crc16_table(void) { unsigned short r, i, j; for (i = 0; i < 256; i++) { r = ((unsigned short) i) << 8; for (j = 0; j < 8; j++) { if (r & (1 << 15)) r = (r << 1) ^ 0x8005; else r = r << 1; } crc_16_table[i] = r; } }
static unsigned short crc16(const char *buf, size_t len) { unsigned short crc = 0xFFFF; while (len--) { crc = crc_16_table[((crc >> 8) ^ *buf++) & 0xFF] ^ (crc << 8); } return crc; }
int main() { make_crc16_table(); return printf("%X
", crc16("\x80\x01\x0C", 3)) == 1; }

Комментариев нет:

Отправить комментарий