#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;
}
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCi8vINCk0YPQvdC60YbQuNGPINC00LvRjyDRgdCy0LDQv9CwICjQvtCx0LzQtdC90LAg0LzQtdGB0YLQsNC80Lgg0LHQsNC50YLQvtCyKQp1aW50MTZfdCBzd2FwX2NyYyh1aW50MTZfdCBjcmMpIHsKICAgIHJldHVybiAoY3JjID4+IDgpIHwgKGNyYyA8PCA4KTsgIC8vINCh0LTQstC40LPQsNC10Lwg0YHRgtCw0YDRiNC40Lkg0LHQsNC50YIg0LIg0LzQu9Cw0LTRiNC40Lkg0Lgg0L3QsNC+0LHQvtGA0L7Rggp9Cgp1aW50MTZfdCBjcmMxNih1aW50OF90ICpkYXRhLCB1aW50MTZfdCBsZW5ndGgpIHsKICAgIHVpbnQxNl90IGNyYyA9IDB4RkZGRjsgIC8vINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINC60L7QvdGC0YDQvtC70YzQvdC+0Lkg0YHRg9C80LzRiyDRgSAweEZGRkYKICAgIHVpbnQxNl90IHBvbHlub21pYWwgPSAweDEwMjE7ICAvLyDQn9C+0LvQuNC90L7QvCBDUkMtMTYKCiAgICAvLyDQntCx0YDQsNCx0LDRgtGL0LLQsNC10Lwg0LrQsNC20LTRi9C5INCx0LDQudGCINC80LDRgdGB0LjQstCwCiAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBjcmMgXj0gKGRhdGFbaV0gPDwgOCk7ICAvLyDQktGB0YLQsNCy0LvRj9C10Lwg0LHQsNC50YIg0LIg0YHRgtCw0YDRiNC40LUg0LHQuNGC0YsgQ1JDCiAgICAgICAgLy8g0J/RgNC40LzQtdC90Y/QtdC8INC/0L7Qu9C40L3QvtC8IENSQwogICAgICAgIGZvciAodWludDhfdCBqID0gMDsgaiA8IDg7IGorKykgewogICAgICAgICAgICBpZiAoY3JjICYgMHg4MDAwKSB7CiAgICAgICAgICAgICAgICBjcmMgPSAoY3JjIDw8IDEpIF4gcG9seW5vbWlhbDsgIC8vINCV0YHQu9C4INGB0YLQsNGA0YjQuNC5INCx0LjRgiDRgNCw0LLQtdC9IDEsINGB0LTQstC40LPQsNC10Lwg0Lgg0L/RgNC40LzQtdC90Y/QtdC8INC/0L7Qu9C40L3QvtC8CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjcmMgPDw9IDE7ICAvLyDQldGB0LvQuCDRgdGC0LDRgNGI0LjQuSDQsdC40YIg0YDQsNCy0LXQvSAwLCDQv9GA0L7RgdGC0L4g0YHQtNCy0LjQs9Cw0LXQvAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vINCf0YDQuNC80LXQvdGP0LXQvCDRgdCy0LDQvyAo0L7QsdC80LXQvSDQsdCw0LnRgtCw0LzQuCkg0L3QsCDQutC+0L3QtdGH0L3QvtC8IENSQwogICAgcmV0dXJuIHN3YXBfY3JjKGNyYyk7ICAvLyDQktC+0LfQstGA0LDRidCw0LXQvCDRgNC10LfRg9C70YzRgtCw0YIg0L/QvtGB0LvQtSDRgdCy0LDQv9CwCn0KCmludCBtYWluKCkgewogICAgLy8g0JzQsNGB0YHQuNCyINC00LDQvdC90YvRhSwg0LTQu9GPINC60L7RgtC+0YDQvtCz0L4g0L3Rg9C20L3QviDQstGL0YfQuNGB0LvQuNGC0YwgQ1JDLTE2CiAgICB1aW50OF90IGNzZW5kX0RBVEFbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdDLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDdDLCAweDAwLCAweDdDLCAweDAwLCAweDdDLCAweDAwLCAweDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEwLCAweEY4fTsKCiAgICAvLyDQktGL0YfQuNGB0LvRj9C10LwgQ1JDLTE2INGBINGB0LLQsNC/0L7QvAogICAgdWludDE2X3QgY3JjID0gY3JjMTYoY3NlbmRfREFUQSwgc2l6ZW9mKGNzZW5kX0RBVEEpIC8gc2l6ZW9mKGNzZW5kX0RBVEFbMF0pKTsKICAgIAogICAgLy8g0JLRi9Cy0L7QtNC40Lwg0YDQtdC30YPQu9GM0YLQsNGCCiAgICBwcmludGYoIkNSQy0xNiB3aXRoIHN3YXA6IDB4JTA0WFxuIiwgY3JjKTsKICAgIHJldHVybiAwOwp9Cg==