📄 crc_table.c
字号:
#include <stdio.h>
const unsigned short cnCRC_16 = 0x8005; /* CRC-16 = X16 + X15 + X2 + X0 */
const unsigned short cnCRC_CCITT = 0x1021; /* CRC-CCITT = X16 + X12 + X5 + X0 */
/* CRC-32 = X32 + X26 + X23 + X22 + X16 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + X0 */
const unsigned long cnCRC_32 = 0x04C10DB7;
unsigned long Table_CRC[256]; /* CRC 表 */
FILE * fp;
void BuildTable16( unsigned short aPoly )
{
unsigned short i, j;
unsigned short nData;
unsigned short nAccum;
for ( i = 0; i < 256; i++ )
{
fprintf(fp,"nData = %0x, \t",i);
nData = ( unsigned short )( i << 8 );
nAccum = 0;
for ( j = 0; j < 8; j++ )
{
if (( nData ^ nAccum ) & 0x8000 ) nAccum = ( nAccum << 1 ) ^ aPoly;
else nAccum <<= 1;
nData <<= 1;
}
Table_CRC[i] = ( unsigned long )nAccum;
fprintf(fp,"Table_CRC[%d] = %0x\n",i,Table_CRC[i]);
}
}
/* 计算 16 位 CRC 值,CRC-16 或 CRC-CCITT */
unsigned short CRC_16( unsigned char * aData, unsigned long aSize )
{
unsigned long i;
unsigned short nAccum = 0;
/* BuildTable16( cnCRC_16 ); // CRC_16 */
BuildTable16( cnCRC_CCITT ); /* CRC_CCITT */
fprintf(fp,"\nCalculate CRC Code by Lookup Table: \n\n");
for ( i = 0; i < aSize; i++ ){
fprintf(fp,"Input data = %0x, \t", *aData);
nAccum = ( nAccum << 8 ) ^ ( unsigned short )Table_CRC[( nAccum >> 8 ) ^ *aData++];
fprintf(fp,"CRC = %0x\n",nAccum);
}
return nAccum;
}
void main()
{
unsigned char aData[] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
unsigned long aSize = 8;
fp = fopen("table_crc.dat","wt");
CRC_16(aData, aSize );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -