fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4.  
  5. uint16_t MyCrc16(const unsigned char *data, int length, uint16_t poly, uint16_t crc)
  6. {
  7. for(int byte=0; byte<length; ++byte)
  8. {
  9. for(int bit=7; bit>=0; --bit)
  10. {
  11. bool doXor = false;
  12. if(crc & 0x8000)
  13. {
  14. doXor = true;
  15. }
  16. crc <<= 1;
  17. if(data[byte] & (1 << bit))
  18. {
  19. crc += 1;
  20. }
  21. if(doXor)
  22. {
  23. crc ^= poly;
  24. }
  25. }
  26. }
  27.  
  28. //augument the crc with 0s
  29. for(int i=0; i<16; i++)
  30. {
  31. bool doXor = false;
  32. if(crc & 0x8000)
  33. {
  34. doXor = true;
  35. }
  36.  
  37. crc = crc << 1;
  38. if(doXor)
  39. {
  40. crc ^= poly;
  41. }
  42. }
  43.  
  44. return crc;
  45. }
  46.  
  47. uint16_t OtherCrc16(const unsigned char *data, int length, uint16_t poly, uint16_t crc)
  48. {
  49. for(int i=0; i<length; i++)
  50. {
  51. crc = crc ^ (data[i] << 8);
  52. for (int bit = 0; bit< 8; bit++)
  53. {
  54. bool doXor = false;
  55. if(crc & 0x8000)
  56. {
  57. doXor = true;
  58. }
  59. crc <<=1;
  60.  
  61. if(doXor)
  62. {
  63. crc ^= poly;
  64. }
  65. }
  66. }
  67. return crc;
  68. }
  69.  
  70.  
  71. int main(void) {
  72. // your code goes here
  73. uint16_t poly = 0x1021;
  74.  
  75. unsigned char c[] = "123456789";
  76. printf("My CRC = %04x\n", MyCrc16(c, 9, poly, 0xffff));
  77. printf("Other CRC = %04x\n", OtherCrc16(c, 9, poly, 0xffff));
  78. return 0;
  79. }
  80.  
Success #stdin #stdout 0s 2168KB
stdin
Standard input is empty
stdout
My CRC = e5cc
Other CRC = 29b1