文章目錄
- 1 crc.c
- 2 crc.h
循環備援校驗(Cyclic Redundancy Check, CRC)是一種根據網絡資料包或計算機檔案等資料産生簡短固定位數校驗碼的一種信道編碼技術,主要用來檢測或校驗資料傳輸或者儲存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。
本文實作 CRC16 的C語言校驗算法,采用的是查表的方法。CRC多項式是 x16+x15+x2+1(0x8005),CRC的初始值為0xFFFF,是modbus的CRC校驗算法。
1 crc.c
#include "crc16.h"
/* CRC16 餘式表 */
static uint16_t crctalbeabs[] = {
0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
};
/*!
* 功 能: CRC16校驗
* param1: 指向要校驗的資料的指針
* param2: 要校驗的資料的長度
* retval: 校驗所得到的值,uint16_t 類型
*
* 說 明: 本次CRC校驗為查表法,多項式為 x16+x15+x2+1(0x8005),CRC的初始值為0xFFFF
*/
uint16_t Crc16(uint8_t *ptr, uint32_t len)
{
uint16_t crc = 0xffff;
uint32_t i;
uint8_t ch;
for (i = 0; i < len; i++) {
ch = *ptr++;
crc = crctalbeabs[(ch ^ crc) & 15] ^ (crc >> 4);
crc = crctalbeabs[((ch >> 4) ^ crc) & 15] ^ (crc >> 4);
}
return crc;
}
2 crc.h
#ifndef _CRC_H_
#define _CRC_H_
#include <stdint.h>
uint16_t Crc16(uint8_t *ptr, uint32_t len);
#define HIG_UINT16(a) ( ((a)>>8) & 0xFF )
#define LOW_UINT16(a) ( (a) & 0xFF )
#define HIG_UINT8(a) ( ((a)>>4) & 0x0F )
#define LOW_UINT8(a) ( (a) & 0x0F )
#endif /* crc.h */