crc16

看到一个很不错的crc16的函数,顺便写了一个小小的测试例子:

#include<stdio.h>
#define  uint16_t unsigned short
#define  uint8_t unsigned char
/*******************************************************************************
 * @fn          crc16
 *
 * @brief       Run the CRC16 Polynomial calculation over the byte parameter.
 *
 * @param       crc - Running CRC calculated so far.
 * @param       val - Value on which to run the CRC16.
 *
 * @return      crc - Updated for the run.
 */
uint16_t crc16(uint16_t crc, uint8_t val)
{
  const uint16_t poly = 0x1021;
  uint8_t cnt;

  for (cnt = 0; cnt < 8; cnt++, val <<= 1)
  {
    uint8_t msb = (crc & 0x8000) ? 1 : 0;

    crc <<= 1;

    if (val & 0x80)
    {
      crc |= 0x0001;
    }

    if (msb)
    {
      crc ^= poly;
    }
  }

  return crc;
}
int main(){
    uint16_t crc = 0;
    uint8_t buf_value[10] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a};
    int i;
    for(i = 0;i < 10;i++){
        crc = crc16(crc, buf_value[i]);
    }
    printf("%x\n",crc);
    
    crc = 0;
    for(i = 0;i < 10;i++){
        crc = crc16(crc, buf_value[i]);
    }
    printf("%x\n",crc);
    
    return 0;
}

运行结果:

crc16