#include #include #include #define BYTE_WIDTH 8 #define INT_WIDTH 32 #define TWO_UP_EIGHT 256 // Store the computed table values in a data file to be used in the Bytewise CRC calculation program. #define OUTPUT_FILE "CRC-32.dat" const unsigned int Poly = 0X04C11DB7; const unsigned int MSB = 0X80000000; const unsigned int PowersOfTwo[INT_WIDTH] = { 0X1, 0X2, 0X4, 0X8, 0X10, 0X20, 0X40, 0X80, 0X100, 0X200, 0X400, 0X800, 0X1000, 0X2000, 0X4000, 0X8000, 0X10000, 0X20000, 0X40000, 0X80000, 0X100000, 0X200000, 0X400000, 0X800000, 0X1000000, 0X2000000, 0X4000000, 0X8000000, 0X10000000, 0X20000000, 0X40000000, 0X80000000 }; // Feed this function "TableIndex" and it will return the corresponding Lookup-Value for CRC-8. unsigned int GenerateLookupTableValue(unsigned char TableIndex){ unsigned int X; unsigned int TheRegister = TableIndex<<24; printf("|%d|\n", TheRegister); // Shift a Byte worth of zeros into the register, and when a "1" is shifted out, perform the required "XOR" operation with "Poly". for ( X = BYTE_WIDTH; X; X-- ) { if ( MSB & TheRegister ) TheRegister = (TheRegister << 1) ^ Poly; else TheRegister <<= 1; } return TheRegister; } // Simply print out "ThisByte" using "1"s and "0"s. void PrintIntInBinary(unsigned int ThisByte){ unsigned int X; char HoldOut[INT_WIDTH + 1]; for ( X = 0; X < INT_WIDTH; X++ ) HoldOut[X] = (ThisByte & PowersOfTwo[INT_WIDTH - 1 - X])? '1': '0'; HoldOut[INT_WIDTH] = '\0'; printf("%s", HoldOut); } int main(){ int X; int Y; unsigned int CalculatedValues[TWO_UP_EIGHT]; FILE* DataOut; DataOut = fopen(OUTPUT_FILE, "wb"); for ( X = 0; X < TWO_UP_EIGHT; X++ ) { CalculatedValues[X] = GenerateLookupTableValue((unsigned char)X); printf("|%3u| - Value-|%2X| - Binary|", X, CalculatedValues[X]); PrintIntInBinary(CalculatedValues[X]); printf("|\n"); } // Verify that each value in the lookup table is unique. // Each value can be the seen as the remainder when a 2-Byte message is divided by "Poly". // The second Byte is always "W" zeros, so only the first byte changes, making it impossible for two remainders to be the same. for ( X = 1; X < TWO_UP_EIGHT; X++ ) { for ( Y = (X - 1); Y >= 0; Y-- ) { if ( CalculatedValues[X] == CalculatedValues[Y] ) printf("Duplicate values found at |%d|, and |%d|\n", X, Y); } } printf("The search for duplicate values in the table is complete.\n"); fwrite(CalculatedValues, sizeof(unsigned int), TWO_UP_EIGHT, DataOut); fclose(DataOut); return 0; }