#include <stdint.h>
#include <stdio.h>
// Функция для свапа (обмена местами байтов)
uint16_t swap_crc(uint16_t crc) {
return (crc >> 8) | (crc << 8); // Сдвигаем старший байт в младший и наоборот
}
uint16_t crc16(uint8_t *data, uint16_t length) {
uint16_t crc = 0xFFFF; // Инициализация контрольной суммы с 0xFFFF
uint16_t polynomial = 0x1021; // Полином CRC-16
// Обрабатываем каждый байт массива
for (uint16_t i = 0; i < length; i++) {
crc ^= (data[i] << 8); // Вставляем байт в старшие биты CRC
// Применяем полином CRC
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ polynomial; // Если старший бит равен 1, сдвигаем и применяем полином
} else {
crc <<= 1; // Если старший бит равен 0, просто сдвигаем
}
}
}
// Применяем свап (обмен байтами) на конечном CRC
return swap_crc(crc); // Возвращаем результат после свапа
}
int main() {
// Массив данных, для которого нужно вычислить CRC-16
uint8_t csend_DATA[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xF8};
// Вычисляем CRC-16 с свапом
uint16_t crc = crc16(csend_DATA, sizeof(csend_DATA) / sizeof(csend_DATA[0]));
// Выводим результат
printf("CRC-16 with swap: 0x%04X\n", crc
); return 0;
}
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KIAovLyDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0YHQstCw0L/QsCAo0L7QsdC80LXQvdCwINC80LXRgdGC0LDQvNC4INCx0LDQudGC0L7QsikKdWludDE2X3Qgc3dhcF9jcmModWludDE2X3QgY3JjKSB7CiAgICByZXR1cm4gKGNyYyA+PiA4KSB8IChjcmMgPDwgOCk7ICAvLyDQodC00LLQuNCz0LDQtdC8INGB0YLQsNGA0YjQuNC5INCx0LDQudGCINCyINC80LvQsNC00YjQuNC5INC4INC90LDQvtCx0L7RgNC+0YIKfQogCnVpbnQxNl90IGNyYzE2KHVpbnQ4X3QgKmRhdGEsIHVpbnQxNl90IGxlbmd0aCkgewogICAgdWludDE2X3QgY3JjID0gMHhGRkZGOyAgLy8g0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LrQvtC90YLRgNC+0LvRjNC90L7QuSDRgdGD0LzQvNGLINGBIDB4RkZGRgogICAgdWludDE2X3QgcG9seW5vbWlhbCA9IDB4MTAyMTsgIC8vINCf0L7Qu9C40L3QvtC8IENSQy0xNgogCiAgICAvLyDQntCx0YDQsNCx0LDRgtGL0LLQsNC10Lwg0LrQsNC20LTRi9C5INCx0LDQudGCINC80LDRgdGB0LjQstCwCiAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBjcmMgXj0gKGRhdGFbaV0gPDwgOCk7ICAvLyDQktGB0YLQsNCy0LvRj9C10Lwg0LHQsNC50YIg0LIg0YHRgtCw0YDRiNC40LUg0LHQuNGC0YsgQ1JDCiAgICAgICAgLy8g0J/RgNC40LzQtdC90Y/QtdC8INC/0L7Qu9C40L3QvtC8IENSQwogICAgICAgIGZvciAodWludDhfdCBqID0gMDsgaiA8IDg7IGorKykgewogICAgICAgICAgICBpZiAoY3JjICYgMHg4MDAwKSB7CiAgICAgICAgICAgICAgICBjcmMgPSAoY3JjIDw8IDEpIF4gcG9seW5vbWlhbDsgIC8vINCV0YHQu9C4INGB0YLQsNGA0YjQuNC5INCx0LjRgiDRgNCw0LLQtdC9IDEsINGB0LTQstC40LPQsNC10Lwg0Lgg0L/RgNC40LzQtdC90Y/QtdC8INC/0L7Qu9C40L3QvtC8CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjcmMgPDw9IDE7ICAvLyDQldGB0LvQuCDRgdGC0LDRgNGI0LjQuSDQsdC40YIg0YDQsNCy0LXQvSAwLCDQv9GA0L7RgdGC0L4g0YHQtNCy0LjQs9Cw0LXQvAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogCiAgICAvLyDQn9GA0LjQvNC10L3Rj9C10Lwg0YHQstCw0L8gKNC+0LHQvNC10L0g0LHQsNC50YLQsNC80LgpINC90LAg0LrQvtC90LXRh9C90L7QvCBDUkMKICAgIHJldHVybiBzd2FwX2NyYyhjcmMpOyAgLy8g0JLQvtC30LLRgNCw0YnQsNC10Lwg0YDQtdC30YPQu9GM0YLQsNGCINC/0L7RgdC70LUg0YHQstCw0L/QsAp9CiAKaW50IG1haW4oKSB7CiAgICAvLyDQnNCw0YHRgdC40LIg0LTQsNC90L3Ri9GFLCDQtNC70Y8g0LrQvtGC0L7RgNC+0LPQviDQvdGD0LbQvdC+INCy0YvRh9C40YHQu9C40YLRjCBDUkMtMTYKICAgIHVpbnQ4X3QgY3NlbmRfREFUQVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N0MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4N0MsIDB4MDAsIDB4N0MsIDB4MDAsIDB4N0MsIDB4MDAsIDB4MDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTAsIDB4Rjh9OwogCiAgICAvLyDQktGL0YfQuNGB0LvRj9C10LwgQ1JDLTE2INGBINGB0LLQsNC/0L7QvAogICAgdWludDE2X3QgY3JjID0gY3JjMTYoY3NlbmRfREFUQSwgc2l6ZW9mKGNzZW5kX0RBVEEpIC8gc2l6ZW9mKGNzZW5kX0RBVEFbMF0pKTsKIAogICAgLy8g0JLRi9Cy0L7QtNC40Lwg0YDQtdC30YPQu9GM0YLQsNGCCiAgICBwcmludGYoIkNSQy0xNiB3aXRoIHN3YXA6IDB4JTA0WFxuIiwgY3JjKTsKICAgIHJldHVybiAwOwp9Cg==