fork download
  1. #include <stdint.h>
  2. #include <stdio.h>
  3.  
  4. // Функция для свапа (обмена местами байтов)
  5. uint16_t swap_crc(uint16_t crc) {
  6. return (crc >> 8) | (crc << 8); // Сдвигаем старший байт в младший и наоборот
  7. }
  8.  
  9. uint16_t crc16(uint8_t *data, uint16_t length) {
  10. uint16_t crc = 0xFFFF; // Инициализация контрольной суммы с 0xFFFF
  11. uint16_t polynomial = 0x1021; // Полином CRC-16
  12.  
  13. // Обрабатываем каждый байт массива
  14. for (uint16_t i = 0; i < length; i++) {
  15. crc ^= (data[i] << 8); // Вставляем байт в старшие биты CRC
  16. // Применяем полином CRC
  17. for (uint8_t j = 0; j < 8; j++) {
  18. if (crc & 0x8000) {
  19. crc = (crc << 1) ^ polynomial; // Если старший бит равен 1, сдвигаем и применяем полином
  20. } else {
  21. crc <<= 1; // Если старший бит равен 0, просто сдвигаем
  22. }
  23. }
  24. }
  25.  
  26. // Применяем свап (обмен байтами) на конечном CRC
  27. return swap_crc(crc); // Возвращаем результат после свапа
  28. }
  29.  
  30. int main() {
  31. // Массив данных, для которого нужно вычислить CRC-16
  32. uint8_t csend_DATA[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
  33. 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x00,
  34. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xF8};
  35.  
  36. // Вычисляем CRC-16 с свапом
  37. uint16_t crc = crc16(csend_DATA, sizeof(csend_DATA) / sizeof(csend_DATA[0]));
  38.  
  39. // Выводим результат
  40. printf("CRC-16 with swap: 0x%04X\n", crc);
  41. return 0;
  42. }
  43.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
CRC-16 with swap: 0xBC60