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[] = { 0xff, 0x07, 0xff, 0x07, 0x00, 0x00, 0x06, 0x00, 0x10, 0xb5 };
  66. // 0x95, 0x08, 0x00, 0x00, 0xee, 0xb0, 0x00, 0x00, 0x81 };
  67.  
  68. uint16_t crc_16 = crc16(data, sizeof(data)/sizeof(uint8_t));
  69. uint8_t crc_8 = crc8(data, sizeof(data)/sizeof(uint8_t));
  70.  
  71. printf("CRC = %04X | %02x\n", crc_16, crc_8);
  72.  
  73. return 0;
  74. }
  75.  
Success #stdin #stdout 0.01s 5296KB
stdin
Standard input is empty
stdout
CRC = F8E6 | 00