home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_11 / 8n11129a < prev    next >
Text File  |  1990-11-06  |  2KB  |  75 lines

  1.  
  2. #include <stdio.h>
  3.  
  4. #define POLY 0x8408
  5. #define START_CRC 0xffff
  6.  
  7. unsigned short crc16(data_p, length, start_crc)
  8. char *data_p;
  9. unsigned short length;
  10. unsigned int start_crc;
  11. {
  12.         unsigned char i;
  13.         unsigned int data;
  14.         unsigned short crc;
  15.  
  16.         crc = start_crc;
  17.  
  18.         if (length == 0)
  19.                 return(~crc);
  20.  
  21.         do
  22.                 {
  23.                 for (i = 0, data = (unsigned int)0xff & *data_p++;
  24.                           i<8;
  25.                           i++, data >>= 1)
  26.                          {
  27.                          if (( crc & 0x0001) ^ (data & 0x0001))
  28.                                 crc = (crc >>1) ^ POLY;
  29.                          else
  30.                                 crc >>= i;
  31.                          }
  32.                 } while (--length);
  33.  
  34.         data = crc;
  35.         crc = (crc << 8)  |  (data >> 8 & 0xFF);
  36.         return(crc);
  37. }
  38.  
  39. main (argc, argv)
  40. int argc;
  41. char *argv[];
  42.  
  43. {
  44.         unsigned char string[40];
  45.         unsigned short crc;
  46.         int len;
  47.  
  48.         string[0] =  'T';
  49.  
  50.  
  51.         crc = crc16(string,1,START_CRC);
  52.  
  53.         printf(" The crc of 'T' is 0x%X.\n",crc);
  54.  
  55.         string[1] = (crc >> 8) & 0xFF;
  56.         string[2] = crc & 0xFF;
  57.  
  58.         crc = crc16(string,3,START_CRC);
  59.  
  60.         printf("The crc of 'T' and its CRC is 0x%X\n",crc);
  61.  
  62.         strcpy(string,"THE,QUICK,BROWN,FOX,0123456789");
  63.         len = strlen(string);
  64.  
  65.         crc = crc16(string,len,START_CRC);
  66.  
  67. printf("The crc of '%s' is 0x%X\n",string,crc);
  68.  
  69. string[len++] = (crc >> 8) & 0xFF;
  70. string[len++] = crc & 0xFF;
  71.  
  72. crc = crc16(string,len,START_CRC);
  73. printf("The crc of '%.*s' and its CRC is 0x%X\n",len-2,string,crc);
  74. }
  75.