RC.h
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:3k
源码类别:

CA认证

开发平台:

Visual C++

  1. // RC.h: interface for the CRC class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. /* crc-16 is based on the polynomial x^16+x^15+x^2+1 */
  5. /*  The data is assumed to be fed in from least to most significant bit */
  6. /* crc-ccitt is based on the polynomial x^16+x^12+x^5+1 */
  7. /*  The data is fed in from most to least significant bit */
  8. /* The prescription for determining the mask to use for a given polynomial
  9. is as follows:
  10. 1.  Represent the polynomial by a 17-bit number
  11. 2.  Assume that the most and least significant bits are 1
  12. 3.  Place the right 16 bits into an integer
  13. 4.  Bit reverse if serial LSB's are sent first
  14. */
  15. #if !defined(AFX_RC_H__C48B6156_A568_4FE0_B9B7_67B4315FE781__INCLUDED_)
  16. #define AFX_RC_H__C48B6156_A568_4FE0_B9B7_67B4315FE781__INCLUDED_
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #define M16 0xA001 /* crc-16 mask */
  21. #define MTT 0x1021 /* crc-ccitt mask */
  22. #if _MSC_VER > 1000
  23. #pragma once
  24. #endif // _MSC_VER > 1000
  25. class CRC  
  26. {
  27. public:
  28. CRC()
  29. {
  30. }
  31. static BOOL GetMemCrc(CMemFile & MemFile, unsigned int & crc16)
  32. {
  33. crc16 = 0;
  34. int ch = 0;
  35. while(MemFile.Read(&ch, sizeof(char)) != -1)
  36. {
  37. crc16 = updcrcr(crc16,ch,M16);
  38. }
  39. return TRUE;
  40. }
  41. static BOOL GetCrc16(char * buf,int buflen,unsigned int & crc16)
  42. {
  43. crc16 = 0;
  44. int ch = 0;
  45. if(buflen == 0)//文件
  46. {
  47. FILE * fp = NULL;
  48. if((fp=fopen(buf,"rb"))==NULL)
  49. {
  50. return FALSE;
  51. }
  52. while((ch=fgetc(fp))!=EOF)
  53. {
  54. crc16 = updcrcr(crc16,ch,M16);
  55. //crctt=updcrc(crctt,ch,MTT);
  56. }
  57. fclose(fp);
  58. return TRUE;
  59. }
  60. else//内存
  61. {
  62. for(int i=0;i<buflen;i++)
  63. {
  64. crc16 = updcrcr(crc16,buf[i],M16);
  65. }
  66. return TRUE;
  67. }
  68. }
  69. //校验CRC值
  70. static BOOL CheckCrc(char * buf,int buflen,unsigned int crc16)
  71. {
  72. UINT uCrc = 0;
  73. if(GetCrc16(buf, buflen, uCrc))
  74. {
  75. return (uCrc == crc16)?TRUE:FALSE;
  76. }
  77. else
  78. return FALSE;
  79. }
  80. virtual ~CRC()
  81. {
  82. }
  83. private:
  84. /* update crc */
  85. static unsigned int updcrc(unsigned int crc,int c,unsigned int mask)
  86. {
  87. int i;
  88. c<<=8;
  89. for(i=0;i<8;i++)
  90. {
  91. if((crc ^ c) & 0x8000) crc=(crc<<1)^mask;
  92. else crc<<=1;
  93. c<<=1;
  94. }
  95. return crc;
  96. }
  97. /* update crc16 reverse */
  98. static unsigned int updcrcr(unsigned int crc,int c,unsigned int mask)
  99. {
  100. int i;
  101. for(i=0;i<8;i++)
  102. {
  103. if((crc ^ c) & 1) crc=(crc>>1)^mask;
  104. else crc>>=1;
  105. c>>=1;
  106. }
  107. return crc;
  108. }
  109. };
  110. #endif // !defined(AFX_RC_H__C48B6156_A568_4FE0_B9B7_67B4315FE781__INCLUDED_)