crc.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "crc.h"
  2. /****************************Info**********************************************
  3. * Name: InvertUint8
  4. * Note: 把字节颠倒过来,如0x12变成0x48
  5. 0x12: 0001 0010
  6. 0x48: 0100 1000
  7. *****************************************************************************/
  8. void InvertUint8(unsigned char *dBuf,unsigned char *srcBuf)
  9. {
  10. int i;
  11. unsigned char tmp[4]={0};
  12. for(i=0;i< 8;i++)
  13. {
  14. if(srcBuf[0]& (1 << i))
  15. tmp[0]|=1<<(7-i);
  16. }
  17. dBuf[0] = tmp[0];
  18. }
  19. void InvertUint16(unsigned short *dBuf,unsigned short *srcBuf)
  20. {
  21. int i;
  22. unsigned short tmp[4]={0};
  23. for(i=0;i< 16;i++)
  24. {
  25. if(srcBuf[0]& (1 << i))
  26. tmp[0]|=1<<(15 - i);
  27. }
  28. dBuf[0] = tmp[0];
  29. }
  30. void InvertUint32(unsigned int *dBuf,unsigned int *srcBuf)
  31. {
  32. int i;
  33. unsigned int tmp[4]={0};
  34. for(i=0;i< 32;i++)
  35. {
  36. if(srcBuf[0]& (1 << i))
  37. tmp[0]|=1<<(31 - i);
  38. }
  39. dBuf[0] = tmp[0];
  40. }
  41. /****************************Info**********************************************
  42. * Name: CRC-16/CCITT x16+x12+x5+1
  43. * Width: 16
  44. * Poly: 0x1021
  45. * Init: 0x0000
  46. * Refin: True
  47. * Refout: True
  48. * Xorout: 0x0000
  49. * Alias: CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT
  50. *****************************************************************************/
  51. #if 0
  52. unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen)
  53. {
  54. unsigned short wCRCin = 0x0000;
  55. unsigned short wCPoly = 0x1021;
  56. unsigned char wChar = 0;
  57. while (datalen--)
  58. {
  59. wChar = *(data++);
  60. InvertUint8(&wChar,&wChar);
  61. wCRCin ^= (wChar << 8);
  62. for(int i = 0;i < 8;i++)
  63. {
  64. if(wCRCin & 0x8000)
  65. wCRCin = (wCRCin << 1) ^ wCPoly;
  66. else
  67. wCRCin = wCRCin << 1;
  68. }
  69. }
  70. InvertUint16(&wCRCin,&wCRCin);
  71. return (wCRCin);
  72. }
  73. #else
  74. //这里为了效率,我们不需要将所有Refin和refout为true的输入输出数据移位转换
  75. //只需要将poly二项式转换后,运算时将左移变为右移
  76. unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen)
  77. {
  78. unsigned short wCRCin = 0x0000;
  79. unsigned short wCPoly = 0x1021;
  80. unsigned char wChar = 0;
  81. InvertUint16(&wCPoly,&wCPoly);
  82. while (datalen--)
  83. {
  84. wCRCin ^= *(data++);
  85. for(int i = 0;i < 8;i++)
  86. {
  87. if(wCRCin & 0x01)
  88. wCRCin = (wCRCin >> 1) ^ wCPoly;
  89. else
  90. wCRCin = wCRCin >> 1;
  91. }
  92. }
  93. return (wCRCin);
  94. }
  95. #endif