crc.c
上传用户:dzjufeng
上传日期:2007-01-06
资源大小:1k
文件大小:2k
源码类别:

加密解密

开发平台:

C/C++

  1. /* compute crc's */
  2. /* crc-16 is based on the polynomial x^16+x^15+x^2+1 */
  3. /*  The data is assumed to be fed in from least to most significant bit */
  4. /* crc-ccitt is based on the polynomial x^16+x^12+x^5+1 */
  5. /*  The data is fed in from most to least significant bit */
  6. /* The prescription for determining the mask to use for a given polynomial
  7. is as follows:
  8. 1.  Represent the polynomial by a 17-bit number
  9. 2.  Assume that the most and least significant bits are 1
  10. 3.  Place the right 16 bits into an integer
  11. 4.  Bit reverse if serial LSB's are sent first
  12. */
  13. /* Usage : crc2 [filename] */
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #define M16 0xA001 /* crc-16 mask */
  18. #define MTT 0x1021 /* crc-ccitt mask */
  19. /* function declarations */
  20. unsigned int updcrc(unsigned int,int,unsigned int);
  21. unsigned int updcrcr(unsigned int,int,unsigned int);
  22. void perr(char *);
  23. /* variables */
  24. char filename[100];
  25. unsigned int crc16,crctt;
  26. int ch;
  27. unsigned long num;
  28. FILE *fp;
  29. /* driver */
  30. main(argc,argv)
  31. int argc; char **argv;
  32. {
  33. if(argc>2) perr("Usage:  crc2 [filename]");
  34. if(argc==2) strcpy(filename,argv[1]);
  35. else
  36. {
  37. printf("nEnter filename:  "); gets(filename);
  38. }
  39. if((fp=fopen(filename,"rb"))==NULL) perr("Can't open file");
  40. num=0L; crc16=crctt=0;
  41. while((ch=fgetc(fp))!=EOF)
  42. {
  43. num++;
  44. crc16=updcrcr(crc16,ch,M16);
  45. crctt=updcrc(crctt,ch,MTT);
  46. }
  47. fclose(fp);
  48. printf("nNumber of bytes = %lunCRC16 = %04XnCRCTT = %04X",
  49. num,crc16,crctt);
  50. }
  51. /* update crc */
  52. unsigned int updcrc(crc,c,mask)
  53. unsigned int crc,mask; int c;
  54. {
  55. int i;
  56. c<<=8;
  57. for(i=0;i<8;i++)
  58. {
  59. if((crc ^ c) & 0x8000) crc=(crc<<1)^mask;
  60. else crc<<=1;
  61. c<<=1;
  62. }
  63. return crc;
  64. }
  65. /* update crc reverse */
  66. unsigned int updcrcr(crc,c,mask)
  67. unsigned int crc,mask; int c;
  68. {
  69. int i;
  70. for(i=0;i<8;i++)
  71. {
  72. if((crc ^ c) & 1) crc=(crc>>1)^mask;
  73. else crc>>=1;
  74. c>>=1;
  75. }
  76. return crc;
  77. }
  78. /* error abort */
  79. void perr(s)
  80. char *s;
  81. {
  82. printf("n%s",s); exit(1);
  83. }