#include <stdio.h> #include <stdlib.h> #include <memory.h> #define POLY 0x04C11DB7L unsigned long get_sum_poly( unsigned char top_byte ) { /// sum all the polys at various offsets unsigned long sum_poly = top_byte << 24; for( int j = 0; j < 8; ++ j ) { /// check the top bit if( ( sum_poly >> 31 ) != 0 ) { /// TODO : understand why '<<' first sum_poly = ( sum_poly << 1 ) ^ POLY; } else { sum_poly <<= 1; } } return sum_poly; } void create_table( unsigned long *table ) { for( int i = 0; i < 256; ++ i ) { table[i] = get_sum_poly( (unsigned char) i ); } } int main() { /// the data unsigned long data = 0x1011035b; /// load the register with the data unsigned long regi = 0; /// allocate memory to contain the AUGMENTED data (added some zeros) unsigned char p[4]; /// copy data memcpy( p, &data, 4 ); /// the table unsigned long table[256]; /// create the table create_table( table ); for (int i=0; i<256; i++) { if (i % 8 == 0) { printf("\n"); } printf("0x%08x, ", table[i]); } /// because data contains 4 bytes for( int i = 0; i < 4; ++ i ) { regi = ( regi << 8 ) ^ table[ ( regi >> 24 ) ^ p[i] ]; } /// and now, register contains the remainder which is also called CRC value. printf("\ncrc32 = %08x\n", regi); return 0; }