fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. #define CRC16_POLY 0xA001
  5. #define CRC8_POLY 0x8C
  6.  
  7. uint16_t _crc16_update(uint16_t crc, uint8_t a)
  8. {
  9. int i;
  10.  
  11. crc ^= a;
  12.  
  13. for (i = 0; i < 8; ++i)
  14. {
  15. if (crc & 1)
  16. crc = (crc >> 1) ^ CRC16_POLY;
  17. else
  18. crc = (crc >> 1);
  19. }
  20.  
  21. return crc;
  22. }
  23.  
  24. uint8_t _crc8_update(uint8_t crc, uint8_t a)
  25. {
  26. int i;
  27.  
  28. crc ^= a;
  29.  
  30. for (i = 0; i < 8; ++i)
  31. {
  32. if (crc & 1)
  33. crc = (crc >> 1) ^ CRC8_POLY;
  34. else
  35. crc = (crc >> 1);
  36. }
  37.  
  38. return crc;
  39. }
  40.  
  41. int crc16(uint8_t *darry, uint16_t sz)
  42. {
  43. uint16_t crc = 0;
  44. uint16_t i;
  45.  
  46. for (i = 0; i < sz; i++)
  47. crc = _crc16_update(crc, darry[i]);
  48.  
  49. return crc;
  50. }
  51.  
  52. int crc8(uint8_t *darry, uint16_t sz)
  53. {
  54. uint8_t crc = 0;
  55. uint16_t i;
  56.  
  57. for (i = 0; i < sz; i++)
  58. crc = _crc8_update(crc, darry[i]);
  59.  
  60. return crc;
  61. }
  62.  
  63. int main(void)
  64. {
  65. uint8_t data[] =
  66. {
  67. 0xA2, 0x03, 0xFD, 0x02, 0xC5, 0x03, 0x61, 0x03, 0xBC,
  68. 0x01, 0xFF, 0x00, 0xC7, 0x01, 0x63, 0x01, 0x19, 0x00,
  69. 0x05, 0x00, 0x0A, 0x00, 0x64, 0x00, 0xFF, 0xFF, 0xFF,
  70. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  71. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  72. 0xFF, 0xFF, 0xFF, 0x1C, 0xC6
  73. };
  74.  
  75. uint16_t crc_16 = crc16(data, sizeof(data)/sizeof(uint8_t));
  76. uint8_t crc_8 = crc8(data, sizeof(data)/sizeof(uint8_t));
  77.  
  78. printf("CRC = %04X | %02x\n", crc_16, crc_8);
  79.  
  80. return 0;
  81. }
  82.  
Success #stdin #stdout 0s 5280KB
stdin
Standard input is empty
stdout
CRC = 0000 | b4