Из мануала к 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;
}
Комментариев нет:
Отправить комментарий