#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;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: