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[] = { 0x05, 0x07, 0xE6, 0x0E, 0x01, 0x06, 0x41, 0xFC,
  66. 0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x14,
  67. 0xF1, 0x0E, 0x08, 0x2F, 0x88, 0xD5, 0x9D, 0x0C,
  68. 0x00, 0x00, 0xCB, 0x00, 0x0D, 0x01, 0xAD, 0x4A,
  69. 0x05, 0x07, 0xE6, 0x0E, 0x01, 0x06, 0x41, 0xFC,
  70. 0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x14,
  71. 0xF1, 0x0E, 0x08, 0x2F, 0x88, 0xD5, 0x9D, 0x0C,
  72. 0x00, 0x00, 0xCB, 0x00, 0x0D, 0x01, 0xAD, 0x4A,
  73. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  74. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  75. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  76. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  77. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  78. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  79. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  80. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xBF };
  81.  
  82. uint16_t crc_16 = crc16(data, sizeof(data)/sizeof(uint8_t));
  83. uint8_t crc_8 = crc8(data, sizeof(data)/sizeof(uint8_t));
  84.  
  85. printf("CRC = %04X | %02x\n", crc_16, crc_8);
  86.  
  87. return 0;
  88. }
  89.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
CRC = 0000 | 55