// ========================================================================== // CRC Generation Unit - Linear Feedback Shift Register implementation // (c) Kay Gorontzi, GHSi.de, distributed under the terms of LGPL // ========================================================================== char *MakeCRC(char *BitString, unsigned char poly) { static char Res[9]; // CRC Result char CRC[8]; int i; char bitcnt; char DoInvert; for (i=0; i<8; ++i) CRC[i] = 0; // Init before calculation for (i=0; i 0; bitcnt--) { if (poly & (1 << bitcnt)) { CRC[bitcnt] = CRC[bitcnt-1] ^ DoInvert; } else { CRC[bitcnt] = CRC[bitcnt-1]; } } if (poly & 1) { CRC[0] = DoInvert; } else { CRC[0] = 0; } } for (i=0; i<8; ++i) Res[7-i] = CRC[i] ? '1' : '0'; // Convert binary to ASCII Res[8] = 0; // Set string terminator return(Res); } // A simple test driver: #include int main() { char *Data, *Result; // Declare two strings int cnt; // Data = "0001000011000001001000010010001000000001"; // straight // Data = "0001000011000001001000010010001000000000"; // Data = "1000000001000100100001001000001100001000"; // compleet andersom // Data = "0000000001000100100001001000001100001000"; // Data = "0000100010000011100001000100010010000000"; // msb first Data = "0000100010000011100001000100010000000000"; for (cnt=0; cnt<256; cnt++) { Result = MakeCRC(Data, cnt); // Calculate CRC printf("CRC of [s] with poly [%i] is [%s]\n", cnt, Result); } return(0); }