#include "stdio.h" #define NMAX 5 unsigned short int A[]={0x1E26, 0x163C, 0x9A2c, 0x1234, 0xFEDC}; unsigned short int CRC_CCITT(unsigned short int A[], int N, int Debug){ // 生成多項式 X^16+X^12+X^5+1 (16進数0x11021) unsigned long CH=0x11021, LDT=A[0]; unsigned short int GDT; if(Debug) printf(" %05X",LDT); for(int i=0, j=0; i<(N-1)*16; i++){ if(i % 16==0) GDT=A[++j];//下位ワード取り出し LDT=(LDT<<1) | (GDT>>15);//1ビット左シフト if(Debug) printf("\n %05X",LDT); if(Debug && (LDT & 0x10000)) printf("→ %05X",LDT ^ CH); if(LDT & 0x10000) LDT ^= CH;//X^16部分が1なら多項式とEXOR GDT <<= 1; } return (unsigned short int) LDT; } int main(){ // CRCを求める unsigned short int CRC= CRC_CCITT(A, NMAX, true); printf("\n ** Result %05X",CRC); getchar(); A[NMAX-1] ^=CRC;//最後のデータにCRCをEXOR printf("\n ** Result %05X",CRC_CCITT(A, NMAX, true)); getchar(); A[NMAX-1] ^=CRC;//最後のデータを元に戻す printf("\n ** No Debug Result %05X",CRC_CCITT(A, NMAX,false)); getchar(); A[NMAX-1] ^=CRC;//最後のデータにCRCをEXOR printf("\n ** No Debug Result %05X",CRC_CCITT(A, NMAX, false)); getchar(); return 0; }