/* FILE: crctst.c */ #include #include #include "crc.h" #include "crctst.h" //#define CRC8 //#define CRC10 //#define X25 //#define CRC16 //#define XMODEM //#define AUTODINII //#define MILSTD188 /* local prototypes */ void crcInit( void ); void displayTbl( unsigned char *tbl ); CRC_TYPE crcUpdate( unsigned char c ); CRC_TYPE crcRead( void ); #ifdef CRC8 unsigned char str[LEN] = { 0x54, 0x48, 0x45, 0xa0 }; unsigned char str0[] = { 0x03, 0x73, 0x61, 0x00 }; unsigned char str1[] = { 0x01, 0x3f, 0xa8, 0x00 }; #endif #ifdef CRC10 unsigned char str[LEN] = { 0x54, 0x48, 0x45, 0x01, 0x1f }; #ifdef CRC10x unsigned char str0[] = { 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* CRC10 = 0x01f6 */ #else unsigned char str0[] = { 0x03, 0x73, 0x01, 0x2d }; #endif unsigned char str1[] = { 0x01, 0x3f, 0x00, 0x45 }; #endif #ifdef XMODEM unsigned char str[LEN] = { 0x54, 0x48, 0x45, 0x1e, 0x0a }; unsigned char str0[] = { 0x03, 0x73, 0x1b, 0xa7 }; unsigned char str1[] = { 0x01, 0x3f, 0xf4, 0x8d }; #endif #ifdef X25 unsigned char str[LEN] = { 0x54, 0x48, 0x45, 0x41, 0xbb }; unsigned char str0[] = { 0x03, 0x73, 0x33, 0x64 }; // X.25 std test case unsigned char str1[] = { 0x01, 0x3f, 0xeb, 0xdf }; // X.25 std test case #endif #ifdef CRC16 unsigned char str[LEN] = { 0x54, 0x48, 0x45, 0xb6, 0x23 }; unsigned char str0[] = { 0x03, 0x73, 0x41, 0x15 }; unsigned char str1[] = { 0x01, 0x3f, 0x80, 0x41 }; #endif #ifdef MILSTD188 unsigned char str[LEN] = { 0x54, 0x48, 0x45, 0x65, 0x98, 0x9b }; unsigned char str0[] = { 0x03, 0x73, 0x7e, 0xa5, 0x8a }; unsigned char str1[] = { 0x01, 0x3f, 0x1a, 0x7d, 0xca }; #endif #ifdef AUTODINII unsigned char str[LEN] = { 0x54, 0x48, 0x45, 0x93, 0xd0, 0x1d, 0x55 }; unsigned char str0[] = { 0x03, 0x73, 0xa3, 0xf8, 0x86, 0xba }; unsigned char str1[] = { 0x01, 0x3f, 0xee, 0xa4, 0x0e, 0x83 }; #endif // | X.25 // CRC16 XMODEM AUTODINII MIL188 |residual CRC char *str2 = "CatMouse987654321"; // 0x38a6 0xe556 0x084bff58 0x9261ec |0xf56e =>0x910a char *str3 = "THE,QUICK,BROWN,FOX,0123456789"; // 0xb96e 0x0498 0x0c0e7bd9 0xbcbe4f |0xdf91 =>0x6e20 char *str4 = "123456789"; // 0xbb3d 0x31c3 0xcbf43926 0x9aac54 |0x6f91 =>0x6e90 static int tblInitialized = 0; static CRC_TYPE crcReg; static CRC_TYPE crcTbl[ 256 ]; int main( void ) { int i, j; CRC_TYPE tmp; printf( "Compiled to support %s CRC\n", CRC_ID ); printf( "CRC initialized to 0x" CRC_PRN "\n", CRC_INIT ); printf( "CRC polynomial is 0x" CRC_PRN "\n", POLY ); crcInit(); for( i=0; i> 2) & 0x00ff) ] ); } return( tmp ); #endif #ifdef X25 /* X.25 swaps bytes (lo byte then hi byte) and complements bits */ return( ~(((crcReg & 0xff) << 8) | (crcReg >> 8)) ); #endif #if defined AUTODINII return( ~crcReg ); #endif #if defined XMODEM || CRC16 || MILSTD188 || CRC8 return( crcReg ); #endif } CRC_TYPE crcUpdate( unsigned char c ) { #if defined CRC8 crcReg = crcTbl[ crcReg ^ c ]; #endif #if defined CRC10 crcReg = (CRC_TYPE)(((crcReg << 8) & 0x3ff) ^ crcTbl[ ((crcReg >> 2) & 0x00ff) ] ^ c ); #endif #if defined XMODEM crcReg = (CRC_TYPE)((crcReg << 8) ^ crcTbl[ ((crcReg >> 8) & 0x00ff) ^ c ]); #endif #if defined X25 || CRC16 || MILSTD188 || AUTODINII crcReg = (CRC_TYPE)((crcReg >> 8) ^ crcTbl[ (crcReg ^ c) & 0x00ff ]); #endif return( crcReg ); } void crcInit( void ) { unsigned long int i, j, k; if( !tblInitialized ){ #if defined CRC8 for( j=0; j < 256; j++ ){ k = j; for( i=0; i < 8; i++ ){ k = k & 0x80? (k << 1) ^ POLY : k << 1; } crcTbl[ j ] = (CRC_TYPE)k; } #endif #if defined CRC10 for( j=0; j < 256; j++ ){ k = j << 2; for( i=0; i < 8; i++ ){ if( (k <<= 1) & 0x0400 ){ k ^= POLY; } } crcTbl[ j ] = (CRC_TYPE)k; } #endif #ifdef XMODEM for( j=0; j < 256; j++ ){ k = j << 8; for( i=0; i < 8; i++ ){ k = k & 0x8000? (k << 1) ^ POLY : k << 1; } crcTbl[ j ] = (CRC_TYPE)k; } #endif #if defined X25 || CRC16 || MILSTD188 || AUTODINII for( i=0; i < 256; i++ ){ j = i; for( k=8; k--; ){ j = j & 1? (j >> 1) ^ POLY : j >> 1; } crcTbl[ i ] = (CRC_TYPE)j; } #endif tblInitialized = 1; } crcReg = CRC_INIT; } void displayTbl( unsigned char *tbl ) { int i, j; for( i=j=0; i < 256; i++ ){ printf( CRC_PRN " ", (CRC_TYPE)tbl[ i ] ); if( ++j > 7 ){ j = 0; printf( "\n" ); } } printf( "\n" ); }