请问各位大哥大姐,谁能告诉我用C语言编写CRC16的源程序!!!!!

解决方案 »

  1.   

    这里有一个例子。
    http://www.laogu.com/yide/shownews.asp?id=436
      

  2.   

    (X^16 + X^12 + X^5 + 1)
      

  3.   

    /* crc-16 */#include <stdio.h>#define bufsiz (16*1024)static WORD crc_table[256];void init_crc_table(void)
    {
          int i, j;
          WORD k;      for (i = 0; i < 256; i++)
          {
                k = 0xC0C1;
                for (j = 1; j < 256; j <<= 1)
                {
                      if (i & j)
                            crc_table[i] ^= k;
                      k = (k << 1) ^ 0x4003;
                }
          }
    }
    /* crc_calc() -- calculate cumulative crc-16 for buffer */WORD crc_calc(WORD crc, char *buf, unsigned nbytes)
    {
          unsigned char *p, *lim;      p = (unsigned char *)buf;
          lim = p + nbytes;
          while (p < lim)
          {
                crc = (crc >> 8 ) ^ crc_table[(crc & 0xFF) ^ *p++];
          }
          return crc;
    }
    void do_file(char *fn)
    {
          static char buf[bufsiz];
          FILE *f;
          int k;
          WORD crc;      f = fopen(fn, "rb");
          if (f == NULL)
          {
                printf("%s: can't open file\n", fn);
                return;
          }
          crc = 0;
          while ((k = fread(buf, 1, bufsiz, f)) != 0)
                crc = crc_calc(crc, buf, k);
          fclose(f);
          printf("%-14s %04X\n", fn, crc);
    }#ifdef TESTint main(int argc, char **argv)
    {
          int i;      if (argc < 2)
          {
                fprintf(stderr, "Usage: crc filename [filename...]\n");
                return EXIT_FAILURE;
          }
          init_crc_table();
          for (i = 1; i < argc; i++)
                do_file(argv[i]);
          return EXIT_SUCCESS;
    }#endif /* TEST */