CRC Generation

A 16-bit CRC using one of the CCITT polynomials is used to confirm message integrity. More...

A 16-bit CRC using one of the CCITT polynomials is used to confirm message integrity.



Polynomial: x16+x12+x5+1 (0x1021)

Initial value: 0xFFFF

Check constant: 0x1D0F

The calculated CRC of the string '123456789' should be 0x29B1

To confirm CRC implementation, the following process can be used:

  1. Calculate the CRC of any message
  2. XOR it with 0xFFFF (bitwise inversion)
  3. Append it to the original message
  4. Perform the CRC calculation on the extended message
  5. Confirm that the new CRC is equal to the check constant (0x1D0F)

Sample C Code for table-driven CRC computation:

  /*
   * crc.h
   */

  #ifndef __CRC16_H
  #define __CRC16_H

  /***----------Table-driven crc function----------***/
  /* Inputs: -size of the character array,           */ 
  /*              the CRC of which is being computed */
  /*         - the initial value of the register to  */
  /*              be used in the calculation         */
  /*         - a pointer to the first element of     */
  /*              said character array               */
  /* Outputs: the crc as an unsigned short int       */
  unsigned short int crc16(int size, int init_val, char *data);

  #endif

  /*
   * crc.c
   */

  #include "crc.h"

  //CRC lookup table for polynomial 0x1021
  const unsigned short int table[256] =
  {0, 4129, 8258, 12387, 16516, 20645, 24774, 28903, 33032, 37161, 41290, 
  45419, 49548, 53677, 57806, 61935, 4657, 528, 12915, 8786, 21173, 
  17044, 29431, 25302, 37689, 33560, 45947, 41818, 54205, 50076, 62463, 
  58334, 9314, 13379, 1056, 5121, 25830, 29895, 17572, 21637, 42346, 
  46411, 34088, 38153, 58862, 62927, 50604, 54669, 13907, 9842, 5649, 
  1584, 30423, 26358, 22165, 18100, 46939, 42874, 38681, 34616, 63455, 
  59390, 55197, 51132, 18628, 22757, 26758, 30887, 2112, 6241, 10242, 
  14371, 51660, 55789, 59790, 63919, 35144, 39273, 43274, 47403, 23285, 
  19156, 31415, 27286, 6769, 2640, 14899, 10770, 56317, 52188, 64447, 
  60318, 39801, 35672, 47931, 43802, 27814, 31879, 19684, 23749, 11298, 
  15363, 3168, 7233, 60846, 64911, 52716, 56781, 44330, 48395, 36200, 
  40265, 32407, 28342, 24277, 20212, 15891, 11826, 7761, 3696, 65439, 
  61374, 57309, 53244, 48923, 44858, 40793, 36728, 37256, 33193, 45514, 
  41451, 53516, 49453, 61774, 57711, 4224, 161, 12482, 8419, 20484, 
  16421, 28742, 24679, 33721, 37784, 41979, 46042, 49981, 54044, 58239, 
  62302, 689, 4752, 8947, 13010, 16949, 21012, 25207, 29270, 46570, 
  42443, 38312, 34185, 62830, 58703, 54572, 50445, 13538, 9411, 5280, 
  1153, 29798, 25671, 21540, 17413, 42971, 47098, 34713, 38840, 59231, 
  63358, 50973, 55100, 9939, 14066, 1681, 5808, 26199, 30326, 17941, 
  22068, 55628, 51565, 63758, 59695, 39368, 35305, 47498, 43435, 22596, 
  18533, 30726, 26663, 6336, 2273, 14466, 10403, 52093, 56156, 60223, 
  64286, 35833, 39896, 43963, 48026, 19061, 23124, 27191, 31254, 2801, 
  6864, 10931, 14994, 64814, 60687, 56684, 52557, 48554, 44427, 40424, 
  36297, 31782, 27655, 23652, 19525, 15522, 11395, 7392, 3265, 61215, 
  65342, 53085, 57212, 44955, 49082, 36825, 40952, 28183, 32310, 20053, 
  24180, 11923, 16050, 3793, 7920};

  /***----------Table-driven crc function----------***/
  /* Inputs: - size of the character array, the CRC  */
  /*               of which is being computed        */
  /*         - the initial value of the register to  */
  /*               be used in the calculation        */
  /*         - a pointer to the first element of     */
  /*               said character array              */
  /* Outputs: the crc as an unsigned short int       */
  unsigned short int crc16(int size, int init_val, char *data)
  {
        unsigned short int crc = (unsigned short int) init_val;
        while(size--) {
              crc = (crc << 8) ^ table[((crc >> 8) ^ *data++) & 0xFFFF];
        }
        return crc;
  }
 All Classes Namespaces Files Functions Variables Typedefs Properties


clearpath_base
Author(s): Mike Purvis
autogenerated on Fri Jan 11 10:11:25 2013