#include <stdio.h>
#include <stdint.h>
uint16_t crc16(uint8_t *data, size_t length, uint16_t polynomial, uint16_t initial, uint16_t xor_out) {
uint16_t crc = initial;
for (size_t i = 0; i < length; i++) {
crc ^= (data[i] << 8);
for (int j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ polynomial;
} else {
crc <<= 1;
}
crc &= 0xFFFF; // Keep CRC within 16 bits
}
}
return crc ^ xor_out;
}
int main() {
// Data setup
uint8_t alive_counter = 0x6C; // Given alive counter
uint8_t data_payload[] = {
0xFF, 0x7F, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00
};
uint16_t data_id = 0xF925;
uint8_t data_id_low = data_id & 0xFF;
uint8_t data_id_high = (data_id >> 8) & 0xFF;
// Prepare the data for CRC calculation
uint8_t data_for_crc[16];
data_for_crc[0] = alive_counter;
for (int i = 0; i < 13; i++) {
data_for_crc[1 + i] = data_payload[i];
}
data_for_crc[14] = data_id_low;
data_for_crc[15] = data_id_high;
// Calculate CRC
uint16_t crc_result = crc16(data_for_crc, 16, 0x1021, 0xFFFF, 0x0000);
// Extract bytes
uint8_t byte0 = crc_result & 0xFF;
uint8_t byte1 = (crc_result >> 8) & 0xFF;
printf("Byte0: CRC_L = %02X\n", byte0);
printf("Byte1: CRC_H = %02X\n", byte1);
// 결과 값 보여주기
uint16_t crc = crc16(data_for_crc, 16, 0x1021, 0xFFFF, 0x0000);
printf("Crc: %04X\n", crc);
return 0;
}
To embed this project on your website, copy the following code and paste it into your website's HTML: